MASUDAQ Blog

NO DEVELOPMENT NO LIFE.

Apache Tomcat 6.0 のフォーム認証

Apache Tomcat 6.0 のフォーム認証の実装の方法を説明する。

Apache Tomcat 6.0 では、レルムというアカウント、ロール管理のフレームワークが提供されている。レルムのアカウントのデーターソースとして以下のデータソースが利用できる。

  • JDBCRealm:
    JDBCRealm: RDB にアカウント情報を保持する。RDB には、JDBC でアクセスする。
  • JDBCRealm:
    RDB にアカウント情報を保持する。RDB には、JDBC でアクセスする。
  • DataSourceRealm:
    RDB にアカウント情報を保持する。RDB には、JNDI 経由の JDBC でアクセスする。
  • JNDIRealm:
    LDAP サーバーにアカウント情報を保持する。LDAP サーバーには、JNDI 経由でアクセスする。
  • UserDatabaseRealm:
    "conf/tomcat-users.xml" にアカウント情報を保持する。 "conf/tomcat-users.xml"  には、JNDI 経由でアクセスする。
  • MemoryRealm: 
    "conf/tomcat-users.xml" にアカウント情報を保持する。JNDI 経由でアクセスしない。
  • JAASRealm:
    Tomcat 5 にはない、Tomcat 6 から追加されたレルム。JAAS(Java Authentication & Authorization Service) フレームワークによる認証を行う。

今回は、UserDatabaseRealm を利用したフォーム認証の実装例を紹介する。

まず、server.xml に以下のノードが定義済みであることを確認する。インストール直後の環境の server.xml では、以下のノードが、デフォルトで定義済となっている。

<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>

これは、"className" で分かるように org.apache.catalina.realm.UserDatabaseRealm を認証方式と定義している。別の認証方式である DataSourceRealm を利用する場合は、org.apache.catalina.realm.DataSourceRealm と定義する。今回は、デフォルト (org.apache.catalina.realm.UserDatabaseRealm) のままでよい。
(*) "Realm " ノードを変更する場合、筆者の環境では、Tomcat ではなく、Eclipse を再起動しないと、設定が有効にならなかった。原因は、調査中。

"conf/tomcat-users.xml" の "<tomcat-users>" 直下にユーザー "user001"、ロール "role001" を以下の通り追加する。

<tomcat-users>
...
<role rolename="role001"/>
<user username="user001" password="user001" roles="role001"/>
...
</tomcat-users>

"conf/tomcat-users.xml" を保存する。

次に、[Dynamic Web Project] を作成し、"WEB-INF/web.xml" の <web-app> ノード下に以下のノードを追加し、ファイルを保存する。

<security-constraint>
  <web-resource-collection>
    <web-resource-name>保護エリア</web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>role001</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>FORM</auth-method>
  <realm-name>Hello, UserDatabaseRealm</realm-name>
  <form-login-config>
    <form-login-page>/logon.jsp</form-login-page>
    <form-error-page>/error.jsp</form-error-page>
  </form-login-config>
</login-config>
<security-role>
  <role-name>role001</role-name>
</security-role>/p>

ププロジェクトに "index.jsp", "logon.jsp"、"error.jp" を追加する。

"index.jsp" の実装は、以下の通り。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Top Page</title>
</head>
<body>
<h2>Hello, UserDatabaseRealm!! </h2>
</body>
</html>

"logoin.jsp" の実装は、以下の通り。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ログオンページ</title>
</head>
<body>
  <form method="POST" action='<%= response.encodeURL("j_security_check") %>' >
  ユーザー名: <input type="text" name="j_username" /><br />
  パスワード: <input type="password" name="j_password" /><br />
  <input type="submit" value="ログイン"><br />
  </form>
</body>
</html>

"error.jsp" の実装は、以下の通り。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ログオンエラーページ</title>
</head>
<body> ユーザー名、もしくは、パスワードが違います。<br />
<a href='<%= response.encodeURL("index.jsp") %>'>ログオン</a>し直してください。<br />
</body>
</html>

プロジェクトを実行すると、welcome-file として定義されている "index.jsp" ではなく、"logon.jsp" に遷移する。ここで、正しいユーザー名、パスワードを入力して、以下のように表示されればよい。

Hello, UserDatabaseRealm!!

間違ったユーザー名、パスワードでログオンしようとすると、以下が表示される。

ユーザー名、もしくは、パスワードが違います。
ログオンし直してください。

以上のように、Apach Tomcat のレルムを利用すると、容易にユーザー認証の仕組みを使うことができた。

このエントリーをはてなブックマークに追加