HTTP-Security

HTTP-SecurityはJavaEEのFilterを利用して、APにユーザ認証とURLベースのアクセス制御を適用する機能である。この仕組みはJavaEEのコンテナ認証とは基本的には別物だが、HTTP-Securityの認証方式の1つとして、コンテナ認証も選択できるようになっている。

それでは基本的な設定方法を見ていこう。

まずweb.xmlにFilterの設定をする。

ソースコード1: web.xml 抜粋(全サンプルのダウンロード)

<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

DelegatingFilterProxyはSpring Frameworkのクラスであり、filter-nameに指定したのと同じBeanIDを持つBeanにその処理を委譲する。

springSecurityFilterChainとはSecurityタグでHTTP-Securityの設定をすると暗黙的に定義されるBeanのIDだ。

マッピングには/*を指定し、すべてのリクエストがこのFilterを通るようにする。

次にBean定義ファイルの設定である。

ソースコード2: applicationContext-security.xml(全サンプルのダウンロード)

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
  http://www.springframework.org/schema/security 
  http://www.springframework.org/schema/security/spring-security-3.0.xsd">

  <!-- HTTP-Securityの設定
  auto-configをtrueにすることでデフォルト設定が有効になり、記述量を削減でき  る -->
  <http auto-config="true">
    <!-- URL毎に必要な権限を記述する
    ここではすべてのURLにアクセスするには、
主体がロールROLE_ADMINを保持していることが必要という意味になる -->
    <intercept-url pattern="/**" access="ROLE_ADMIN" />
  </http>

  <!-- ユーザ認証の設定
  authentication-managerはユーザ認証処理を
1つ以上のauthentication-providerに委譲する -->
  <authentication-manager>
    <!-- Bean定義ファイルやRDBMSから主体情報を取得し、
ユーザ認証を行うauthentication-provider -->
    <authentication-provider>
      <!-- Bean定義ファイルから主体情報を取得するuser-service -->
      <user-service>
       <!-- 個別の主体情報を設定
        password-encoderタグでshaやmd5、独自ハッシュ関数を指定して、
password属性にハッシュ値を利用することも可能 -->
       <user name="user" password="useruser" authorities="ROLE_USER" />
       <user name="admin" password="adminadmin" authorities="ROLE_ADMIN" />
      </user-service>
      <!-- RDBMSから主体情報を取得するjdbc-user-serviceを利用することも可能 -->
    </authentication-provider>
    <!-- LDAPから主体情報を取得して、ユーザ認証を行う
ldap-authentication-providerや
    独自のauthentication-providerを利用することも可能 -->
  </authentication-manager>

</beans:beans>

Bean定義ファイルではSecurityタグを利用するための宣言を最上部でしている。

Spring Securityを利用する際には、専用のBean定義ファイルを1つ用意し、そのファイル内ではプレフィックスなしでSecurityタグを利用できるようにするのがお勧めである。

各タグの説明についてはソースコードのコメントを見てほしい。

この数行の設定でSpring Securityの動作に必要なBeanが、beanタグをいちいち記述しなくても生成される。

手元にSpring Frameworkを使って構築されたAPがあれば、Spring Securityのライブラリと上記の設定ファイルをダウンロードして配置してみてほしい。手元に適切なAPがない場合には、次の簡単なJSPを必要なjarとともに配置して、動作を確認してほしい。

ソースコード3: index.jsp(全サンプルのダウンロード)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>ユーザ認証・アクセス制御成功</title>
</head>
<body>
<h1>ユーザ認証・アクセス制御に成功し、ページが表示されました。</h1>
</body>
</html>

APを起動すると次のようなユーザ認証の画面が表示されるはずだ。

図1: ログイン画面

この画面はSpring Securityが自動的に生成したものだが、もちろん独自の認証画面を用意することもできる。上記のBean定義ファイルで設定したusernameとpasswordを指定して、その動作を確認してみてほしい。 auto-configの設定をするとform認証が有効になるが、basic認証が利用したい場合には次のように記述するだけだ。

ソースコード4: applicationContext-security.xml抜粋(全サンプルのダウンロード)

<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_ADMIN" />
<!-- basic認証を有効化 -->
<http-basic />
</http>

またform認証のログインページを独自のものと差し替えたい場合には、次のようなJSPとBean定義ファイルを用意する。

ソースコード5: login.jsp(全サンプルのダウンロード)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<form name="login_form" action="j_spring_security_check" method="post">
username <input type="text" name="j_username" /><br />
password <input type="password" name="j_password" /><br />
<input type="submit" value="ログイン" /></form>
</body>
</html>

ソースコード5: applicationContext-security.xml抜粋(全サンプルのダウンロード)

<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_ADMIN" />
<intercept-url pattern="/login.jsp*" filters="none" />
<!-- ログイン画面を独自の画面に切り替える -->
<form-login login-page="/login.jsp" />
</http>

カスタムタグを利用して、JSP上で権限ごとに表示する項目を制御することもできるが、詳しくはリファレンスを参照してほしい。