java:securityfilter
SecurityFilter
SecurityFilter は、Java EE サーブレットコンテナ上で動作する Web アプリケーションに認証機能(Authentication and Authorization)を追加するライブラリ。
- 機能は javax.servlet.Filter として提供
- ログイン機能(Authentication)
- アクセス制御(Authorization)
- Servletコンテナ標準仕様の認証機能と同様の動作をする。フォーム認証用のHTMLの書き方も同じ。
- Servlet API対応
- HttpServletRequestの、getRemoteUserメソッドやgetUserPrincipalメソッドが使える。
- サーブレットコンテナのログイン機能からの移行も容易。
- StrutsのServlet APIを使ったアクセス制御(struts-configにroleを記述して制限)が動作。
- 自動再ログイン機能
認証ロジックについては、org.securityfilter.realm.SecurityRealmInterfaceインターフェースを実装した認証クラスを自作しなくてはならないが、完全にゼロからログイン機能を実装することを考えると遥かに容易で、認証ロジックのみに集中してコードを書くことができる。
使い方
いくつか依存JarがあるのでMavenを使うと楽。
<dependency> <groupId>securityfilter</groupId> <artifactId>securityfilter</artifactId> <version>2.0</version> </dependency>
web.xmlにフィルタ設定を記述
<filter> <filter-name>securityfilter</filter-name> <filter-class>org.securityfilter.filter.SecurityFilter</filter-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/securityfilter-config.xml</param-value> </init-param> <init-param> <param-name>validate</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>securityfilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
WEB-INF/securityfilter-config.xmlに動作設定を記述。
<!DOCTYPE securityfilter-config PUBLIC "-//SecurityFilter.org//DTD Security Filter Configuration 2.0//EN" "http://www.securityfilter.org/dtd/securityfilter-config_2_0.dtd"> <securityfilter-config> <!-- アクセス制御設定、/memberOnly/は、memberとadminロールのみアクセス許可。security-constraintはいくつでも書けます --> <security-constraint> <web-resource-collection> <web-resource-name>Secure Page</web-resource-name> <url-pattern>/memberOnly/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>member</role-name> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>MyLDAPRealm</realm-name> <form-login-config> <form-login-page>/login.do</form-login-page><!-- ログインページへのリダイレクト先 --> <form-error-page>/error.do</form-error-page><!-- 認証失敗時のフォワード先 --> <form-default-page>/list.do</form-default-page><!-- 認証後のデフォルトのリダイレクト先 --> <form-logout-page>/logout.do</form-logout-page><!-- このURLにアクセスするとログアウト処理を行う --> <!-- ユーザ名、パスワードをクッキーに保存して自動再ログインする設定 --> <remember-me className="org.securityfilter.authenticator.persistent.DefaultPersistentLoginManager"> <remember-me-param name="cookieLife" value="15" /> <remember-me-param name="protection" value="all" /> <remember-me-param name="useIP" value="true" /> <remember-me-param name="encryptionAlgorithm" value="DES" /> <remember-me-param name="encryptionMode" value="ECB" /> <remember-me-param name="encryptionPadding" value="PKCS5Padding" /> <remember-me-param name="validationKey" value="347382902489402489754895734890347" /><!-- この値は書き換えて!! --> <remember-me-param name="encryptionKey" value="347892347028490237487846240673842" /><!-- この値は書き換えて!! --> </remember-me> </form-login-config> </login-config> <realm className="jp.paulownia.securityfilter.realm.LDAPRealm"> <realm-param name="userBase" value="ou=people,dc=paulownia,dc=jp"/> <realm-param name="userSearch" value="(uid={0})"/> <realm-param name="userRoleName" value="role"/> <realm-param name="contextFactory" value="com.sun.jndi.ldap.LdapCtxFactory"/> <realm-param name="connectionURL" value="ldap://ldap.paulownia.jp/"/> </realm> </securityfilter-config>
認証フォーム
フォーム認証を行う場合のHTMLの書き方。
<form action="j_security_check" method="post" > <input type="password" name="j_password" size="24"/> <input type="text" name="j_username" size="24"/> <input type="checkbox" name="j_rememberme" value="true" /> </form>
actionやnameの「j_なんたらかんたら」はJ2EEの予約語。j_remembermeはセキュリティフィルタのオリジナル。
Realmの書き方
org.securityfilter.realm.SecurityRealmInterface
インターフェースを実装した認証クラスを自作し、認証ロジックを書く。実装するメソッドは2つ。
// ログイン処理、失敗したときはnullを返す java.security.Principal authenticate(String username, String password); // アクセス制御処理 boolean isUserInRole(java.security.Principal principal, String rolename);
HttpServletRequestのメソッド対応
セキュリティフィルタを使うと、HttpServletRequestから認証情報を取得できるようになる。
getRemoteUser
、ログイン時に入力したユーザIDを取得isUserInRole
、SecurityRealmInterface#isUserInRoleの結果を返すgetUserPrincipal
、SecurityRealmInterface#authenticateの戻り値と同じインスタンスを返す
ロールを使わない方法
適当なロールをauth-constraintに設定し、RealmのisUserInRoleをいつもtrueにする。
java/securityfilter.txt · 最終更新: 2007/10/09 11:11 by 127.0.0.1