03-1.Spring Security 2の設定方法

概要

Spring Securityの設定方法を見ていきます。

ここでは、Spring Security2.0についての説明になりますが、3.x系でもほぼ同じです(詳しくは3.0への変更やサンプルの記事を見てください)。

バージョンがいくつであれ、設定はSpringの設定ファイル上で行います。

また、設定を簡易にするために用意されたXMLの名前空間を追加できます。

ここでは設定のみを記述します。先立って、通信シーケンスを記述したSpringSecurityの概要を読んでおいてもらえると理解しやすいです。

内部動作を知っておきたい場合は、こちらをご覧ください。

目標

まず、以下のサンプルの目標(ゴール)を示します。

ゴールはWEB上でログイン認証とアクセス制御を実現することです。

ログイン画面からID/PWを入力し、認証NGのときは認証エラー画面へ、認証OKのときはトップ画面へ遷移する。

そんな動作をするようにします。

設定サンプル

<サンプルWEB設定ファイル: web.xml>

Spring Securityはフィルタですのでweb.xmlに設定します。

少し独特なのは、web.xmlにはフィルタ呼び出し用のフィルタを設定するところです。

実際の処理を記述したフィルタはSpringの設定ファイルに記述しておき、呼び出し用フィルタが記述したフィルタを呼び出します。

【wen.xml】

<!-- Springの設定です -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext.xml /WEB-INF/applicationSecurity.xml</param-value>

</context-param>

<!-- SpringSecurityのフィルター設定です -->

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

<サンプルSpring設定ファイル: /WEB-INF/applicationContext.xml>

ここでは特に重要なファイルではありません。

ですので何も記述しないファイルをサンプルとして載せておきます。

【applicationContext.xml】

<beans xmlns="http://www.springframework.org/schema/beans "

xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance "

xmlns:util="http://www.springframework.org/schema/util "

xmlns:aop ="http://www.springframework.org/schema/aop "

xmlns:tx ="http://www.springframework.org/schema/tx "

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/util

http://www.springframework.org/schema/util/spring-util-2.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-2.0.xsd ">

</beans>

<サンプルSecurity設定ファイル: /WEB-INF/applicationSecurity.xml >

SpringSecurityの設定のメインファイルです。

【Spring設定ファイル】

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:util="http://www.springframework.org/schema/util"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:sec="http://www.springframework.org/schema/security"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/util

http://www.springframework.org/schema/util/spring-util.xsd

http://www.springframework.org/schema/security

http://www.springframework.org/schema/security/spring-security-2.0.1.xsd

">

<!-- 認証とアクセス制御の設定です -->

<sec:http auto-config="true" access-denied-page="/403.jsp" >

<!-- アクセス制限のパス設定 -->

<sec:intercept-url pattern="/sec/sys*" access="ROLE_ADMIN"/>

<sec:intercept-url pattern="/sec/usr*" access="ROLE_ADMIN,ROLE_USER"/>

<sec:intercept-url pattern="/sec/**" access="IS_AUTHENTICATED_FULLY"/>

<sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

<!-- 認証の設定 -->

<sec:form-login login-page="/login.jsp" default-target-url="/top.jsp" authentication-failure-url="/error.jsp"/>

<sec:logout logout-url="/logout" logout-success-url="/login.jsp" invalidate-session="true"/>

<sec:anonymous granted-authority="ROLE_ANONYMOUS"/>

</sec:http>

<!--

認証手形発行所の設定。ログインID/PWの情報をメモリから取得する方法です。SQL文を指定してDBから取得する方法もあります。

-->

<sec:authentication-provider>

<sec:user-service>

<sec:user password="admin" name="admin" authorities="ROLE_ADMIN"/>

<sec:user password="user" name="user" authorities="ROLE_USER"/>

</sec:user-service>

</sec:authentication-provider>

</beans>

【httpタグで使用できる属性】

【httpタグ内で使用できる主なタグ】

※予約語 (主な予約語は以下のとおりです)

IS_AUTHENTICATED_FULLY ・・・認証されたユーザすべて

IS_AUTHENTICATED_ANONYMOUSLY・・・認証されたユーザと認証されていないユーザすべて

【authentication-providerタグの主な属性】

属性名

user-service-ref

概要

ユーザサービスをカスタマイズした場合に指定します。通常は必要ありません。

【authentication-providerタグ内で使用できるの主なタグ】

<ログイン画面サンプル: login.jsp>

<html>

<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>ログイン</title>

</head>

<body>

<form name="f" action="<c:url value='j_spring_security_check'/>" method="post">

<table class="login">

<tr>

<th>ログインID</th>

<td><input type="text" name="j_username"></td>

</tr>

<tr>

<th>ログインPW</th>

<td><input type="text" name="j_password"></td>

</tr>

</table>

<input type="submit" name="login" value="ログイン">

</form>

</body>

</html>

<認証エラー画面サンプル: error.jsp>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">

<title>Insert title here</title>

</head>

<body>

認証に失敗しました。<br>

<input type="button" onclick="javascript: history.back();" value="戻る">

</body>

</html>

<権限エラー画面サンプル: 403.jsp>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">

<title>Insert title here</title>

</head>

<body>

閲覧権限がありません。<br>

<input type="button" onclick="javascript: history.back();" value="戻る">

</body>

</html>

<トップ画面サンプル: top.jsp>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">

<title>Insert title here</title>

</head>

<body>

トップページです。<br>

ログイン認証成功おめでとうございます。

</body>

</html>

上記のサンプルを起動するとログイン画面が表示されます。

ログイン画面で ID/PW として、 admin/admin を入力してサブミットするとトップページに遷移します。

設定ファイルのタグのそれぞれの意味は記述しましので、読んでいただくとある程度自分がやりたいことができるのではないでしょうか。

認証手形にはユーザIDなども記述されており、ログイン後に取り出して処理することや、JSPの画面に表示することもできます。

Spring Securityではtaglibも用意されているため、JSPで使用したい場合もかなり楽になるはずです。

また、複数のシステム(DB)にユーザIDが登録されており、どれかにユーザIDが登録されていればログインOKにさせたい場合なども設定ファイルを書き直すだけでできます。

(認証手形発行所(DaoAuthenticationProvider)を複数設定するだけです。)

コードを一切記述することなしにログイン認証、アクセス制御の機能をつけることができる、とても良い機能です。

内部動作の記事も参考にしていただければ拡張するポイントが把握しやすくなると思います(拡張のサンプル)。

補足

内部動作を説明した記事をご覧になった方は「あれ!?」って思ったかもしれません。

あれだけフィルタ、フィルタと言って説明していたのに、Security設定ファイルにフィルタらしき記述が一切ありません。

実は、SpringSecurityは設定ファイルを記述すると自動でSpringのAplicationContextにフィルタのbeanを登録するのです。

例えば<sec:authentication-provider>タグなども、内部ではAuthenticationProviderに置き換わっています。

ですので、独自フィルタクラスを導入するときは自分でbeanタグでフィルタを記述していく必要があります。

このあたりもSpringSecurityではなるべく簡単に設定できるように工夫はされています。

独自フィルタクラスを作成しましたら、sec:custom-filterタグを使用して既存フィルタを差し替えるか、前後に挿入するかできます。

例<sec:custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/>

本家のリファレンスなども参考にすれば簡単に機能追加できるかと思います(拡張のサンプル)。

弱点

便利なSpring Securityですがいくつか弱点があります。

・認証手形(Authentication)にユーザの他の情報も追加したい場合に、コードを記述しなければいけなくなります。

それほどたしたコードではないのですが、リフレクションなどを使用して設定ファイルだけで漢字ユーザ名などを追加できると便利です。

・特殊な認証を追加するのには少し複雑になります。

例えばID/PWで認証する方法と、指紋で認証する方法を、外部設定ファイルの値によりスイッチしたいような場合です。

(外部設定ファイルに"1"と記述された場合はID/PW方式、 "2"と記述された場合は指紋認証方式のように障害時にそなえて切り替え可能にしたい場合)

・ログイン認証完了後やアクセスエラー時にログ出力するような機能がない。

お客様によっては認証とアクセスエラーをログ出力してほしいという場合もあるかともいますが、特に機能が用意されていません。

soracaneを使用すると、上記のような弱点も補うことができます。

Created Date: 2010/01/02