JBossでFORM認証
ユーザー認証で面倒なコードを書かなくても、設定ファイルにちょこちょこっと書くだけで後はJBossが面倒見てくれる。Tomcatでも出来るけど(っていうか他のコンテナでも?)。
以前のエントリーでJBossの設定について簡単に書いたので、環境に関してはそっちを参照。
以下、具体的な設定。
このサイトを参考にした。使ってる方法はDIGEST認証だけど、基本的なやり方は違わないし分かりやすいページなのでオススメ。このページも見やすい。
・web.xml
どのページ(URL)に認証をかけるか、ログイン画面等を設定。realm-name(ここではfoo)は他のファイルから参照される。
<auth-method>FORM</auth-method>
<realm-name>foo</realm-name>
<form-login-config>
<form-login-page>/common/login_first.jsp</form-login-page>
<form-error-page>/common/login_error.jsp</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>main</web-resource-name>
<url-pattern>/servlet/*</url-pattern>
<url-pattern>/jsp/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-role>
<role-name>USER</role-name>
</security-role>
・login-config.xml
認証の具体的な設定内容を記述する。パスワードチェック、ログイン、ログイン失敗etcの時に実行されるSQLを記述する。当然テーブル(この例ではuser, active_users)は事前に作成しておく。
<authentication>
<login-module code = “org.jboss.security.auth.spi.DatabaseServerLoginModule” flag = “required”>
<module-option name = “unauthenticatedIdentity”>guest</module-option>
<module-option name = “dsJndiName”>java:/fooDS</module-option>
<module-option name = “principalsQuery”>SELECT passwd FROM user WHERE user_id=?</module-option>
<module-option name = “rolesQuery”>SELECT role, ‘Roles’ FROM user WHERE user_id=?</module-option>
<module-option name = “setLoggedInQuery”>insert into active_users (username) values (?)</module-option>
<module-option name = “isLoggedInQuery”>select * from active_users where username=?</module-option>
<module-option name = “resetCounterQuery”>update user set num_login_failure = 0 where user_id = ?</module-option>
<module-option name = “incrementCounterQuery”>update user set num_login_failure = num_login_failure + 1 where user_id = ?</module-option>
<module-option name = “getCounterQuery”>select num_login_failure + 1000*active_status from user where user_id = ?</module-option>
<module-option name = “logQuery”>insert into login_log (login, date, info) values (?,?,?)</module-option>
<module-option name = “maxRetries”>5</module-option>
<module-option name = “hashAlgorithm”>MD5</module-option>
<module-option name = “hashUserPassword”>true</module-option>
</login-module>
</authentication>
</application-policy>
・jboss-web.xml
このファイルではこのWebアプリケーションでの認証方法を指定する。login-config.xmlの<application-policy name=”これ”>の値を設定する。
<security-domain>java:/jaas/foo</security-domain>
</jboss-web>
・xxxx-ds.xml
login-config.xmlで、データベースのをチェックしに行くように設定したけど、DBに接続する為にデータソースを作成する必要がある。
以下のようなファイルを作成。
<xa-datasource>
<jndi-name>fooDS</jndi-name>
<xa-datasource-class>com.informix.jdbcx.IfxXADataSource</xa-datasource-class>
<xa-datasource-property name=”IfxIFXHOST”>server1</xa-datasource-property>
<xa-datasource-property name=”Description”>db connection</xa-datasource-property>
<xa-datasource-property name=”PortNumber”>1526</xa-datasource-property>
<xa-datasource-property name=”DatabaseName”>db_name</xa-datasource-property>
<xa-datasource-property name=”ServerName”>server_name</xa-datasource-property>
<xa-datasource-property name=”User”>user</xa-datasource-property>
<xa-datasource-property name=”Password”>pass</xa-datasource-property>
<xa-datasource-property name=”IfxIFX_XASPEC”>Y</xa-datasource-property>
<user-name>user</user-name>
<password>pass</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.InformixExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>InformixDB</type-mapping>
</metadata>
</xa-datasource>
</datasources>
これで一通り完了。後はjspでこんな感じのフォームを作ればok
user:<input type=”text” name=”j_username”>
pass:<input type=”password” name=”j_password”>
<input type=”submit” name=”submit” value=”login”>
</form>
j_security_checkとかは特別な名前であらかじめ定義されているので、自分でweb.xmlとかを設定する必要はない。