SecurityFilter

SecurityFilterは、J2EE Webアプリケーションに認証・承認機能を追加できるライブラリ。Tomcatのようなサーブレットコンテナはそれ自身が認証機能を持っているが、SecurityFilterはどのコンテナでも使えるとか、自動ログインをサポートしているといった特典があるらしい。一番嬉しいのはwarの中に設定ファイルやクラスを全部置けることだ。

しかし、日本語の情報が全然なく、SourceForgeのプロジェクトサイトでさえも情報が少なく使い方がよく分からない。使い方をメモ。
まずライブラリをプロジェクトに追加。Mavenを使っているならば、pom.xmlに以下の記述を追加。

<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>

securityfilter-config.xmlを作成し、WEB-INF以下に設置。詳しい解説は省くが内容は以下の通り。

<!DOCTYPE securityfilter-config PUBLIC
  "-//SecurityFilter.org//DTD Security Filter Configuration 1.1//EN"
  "http://www.securityfilter.org/dtd/securityfilter-config_1_1.dtd">

<securityfilter-config>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Secure Page</web-resource-name>
      <url-pattern>*.do</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>member</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>NeoLDAPRealm</realm-name>
    <form-login-config>
      <form-login-page>/login.do</form-login-page>
      <form-error-page>/autherr.do</form-error-page>
      <form-default-page>/list.do</form-default-page>
    </form-login-config>
  </login-config>
  
  <security-role>
    <description>Required LDAP Auth</description>
    <role-name>tomcat</role-name>
  </security-role>

  <realm className="com.example.securityfilter.realm.LDAPRealm">
    <realm-param name="userBase" value="ou=people,dc=example,dc=com"/>
    <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.example.com/"/>
  </realm>
</securityfilter-config>

Realmはorg.securityfilter.realm.SecurityRealmInterfaceを実装した認証ロジックを記述したクラス。SecurityCatalinaRealmAdapterを用いるとTomcatのレルムを利用する事ができるらしいが、Tomcat 6ではWebアプリが起動できなかった。JNDIRealmに似せた簡単なLDAP認証クラスを作って試してみた。

ログインページは以下のフォームを持ったページを指定する。これはサーブレットコンテナ標準の認証ページと同じもの。

<form method="post" action="j_security_check">
  <input type="text" name="j_username" />
  <input type="password" name="j_password" />
</form>

TomcatのRealmは使えなかったが、Realmに認証ロジックだけ記述すれば良く、面倒なアクセスコントロール処理、セッション管理のコードは一切不要。悪くない。

追記:
SecurityFilterと自動ログイン