2011年11月12日土曜日

Tomcat 6(Windows X64版) JDBCレルムによるFORM認証

JDBCレルムを使用したFORM認証の設定について説明します。
なお、MySQLのデータベースにはauth_usersとauth_rolesテーブルを作成済みであり、以下のエントリが登録されていることを前提とします。

■ユーザテーブル
mysql> select * from auth_users;
+-----------+---------------+
| user_name | user_password |
+-----------+---------------+
| hanako    | pass          |
+-----------+---------------+
1 row in set (0.18 sec)

■ロールテーブル
mysql> select * from auth_roles;
+-----------+-----------+
| user_name | role_name |
+-----------+-----------+
| hanako    | admin     |
+-----------+-----------+
1 row in set (0.02 sec)

①MySQLのJDBCライブラリ「MySQL Connector/J」を以下のURLからダウンロードします。
ダウンロードした「mysql-connector-java-5.1.18.zip」を解凍し、mysql-connector-java-5.1.18-binをC:\Program Files\Apache Software Foundation\Tomcat 6.0\lib配下にコピーします。


②sever.xml(C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf配下)を修正します。以下のJDBCレルムを追加します。
connectionURLには、接続先のMySQLのURLを記載する。
connectionNameには、接続用ユーザ名を記載する。
connectionPasswordには、接続用パスワードを記載する。
userTableには、ユーザテーブル名を記載する。
userRoleTableには、ロールテーブル名を記載する。
userNameColには、ユーザテーブル/ロールテーブルのユーザに相当するカラム名を記載する。
userCredColには、ユーザテーブルのパスワードに相当するカラム名を記載する。
roleNameColには、ロールテーブルのロールに相当するカラム名を記載する。
  <!-- JDBCレルムの設定 -->
      <Realm className="org.apache.catalina.realm.JDBCRealm"
             driverName="org.gjt.mm.mysql.Driver"
             connectionURL="jdbc:mysql://localhost:3306/bushido"
             userTable="auth_users" userNameCol="user_name" userCredCol="user_password"
             userRoleTable="auth_roles" roleNameCol="role_name"
             connectionName="root" connectionPassword="password"/>

③FORM認証をおこなうサンプルアプリをTomcatに配備します。
C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps配下に、SampleAppフォルダを作成し、以下の資源を格納します。

SampleApp
   |- login.jsp
   |- login_err.html
   |- sample.html
   |- WEB-INF
   |    |- web.xml
   |- META-INF
        |- context.xml

■login.jsp
<html>
<head><title>ログイン画面</title></head>
<body>
<form method="post" action='<%= response.encodeURL("j_security_check")%>'>
<table>
  <tr>
    <td>ユーザID</td>
    <td> <input type="text" name="j_username"></td>
  </tr>
  <tr>
    <td>パスワード</td>
    <td><input type="password" name="j_password"></td>
  </tr>
</table>
<br>
<input type="submit" value="ログイン" name="submit">
<input type="reset" value="リセット" name="reset">
</form>
</body>
</html>

■web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>FormAuth</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>admin</role-name>
    </auth-constraint>
  </security-constraint>
  <login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/login_err.html</form-error-page>
    </form-login-config>
  </login-config>
  <security-role>
    <role-name>admin</role-name>
  </security-role>
</web-app>
■context.xml
<Context docbase="sampleapp" path="sampleapp" reloadable="true" />

③Tomcatを再起動します。

④「http://127.0.0.1:8080/sampleapp/sample.html」にアクセスし、FORM認証画面が表示されることを確認します。また、FORM認証後に、サンプルアプリの画面が表示されることを確認します。



【補足】
Tomcat6には、コンテナ管理機能がある。今回は、トップのserver.xmlにレルム認証の設定をしたが、各コンテナ(アプリ)ごとに異なる認証レルムを設定できる模様(こういう要件は多分にありそう)
具体的には、各アプリが持つcontext.xmlに記載することで実現できそう。時間があったら調査しよう。

0 件のコメント: