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 のレルムを利用すると、容易にユーザー認証の仕組みを使うことができた。
コメント (0)
コメントの投稿