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を起動すると次のようなユーザ認証の画面が表示されるはずだ。
この画面は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上で権限ごとに表示する項目を制御することもできるが、詳しくはリファレンスを参照してほしい。