認証結果とアクセス認可結果をログ出力する部品

Spring Securityは強力なツールですが、ログ出力が少し弱いです。

認証の成否、アクセス制御結果、などを出力して欲しいのですが、デフォルトではそのような機能は存在しないようです。

Log4jの設定で、SpringSecurityのクラスだけDebugモードにすれば出力しますが、よけいな情報も多数出力されます。

また、日本語にすることもできません。

ログ出力を行いたい場合はsoracaneで用意しています、ExtendedAuthenticationProcessingFilter、SecurityLoggingといった部品が役に立ちます。

・ExtendedAuthenticationProcessingFilter・・・認証の成否をログ出力できます。

・SecurityLoggingFilter・・・アクセス制御結果をログ出力できます。

メッセージはメッセージリソースで変更することもできます。

以下では、具体的に利用方法を見ていきます。

目標

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

認証の成否のログ出力と、アクセス制御の結果をログ出力することを目標にします。

以下で見ていきますが、設定ファイルで設定するだけです。

使用サンプル

<SpringSecurity設定ファイル: security.xml>

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

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

xsi:schemaLocation="

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

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

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

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

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

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

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

http://www.springframework.org/schema/context/spring-context-2.5.xsd

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

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

<!--

-->

<sec:http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint"

access-denied-page="/403.jsp" path-type="ant" >

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

<sec:intercept-url pattern="/error.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

<sec:intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

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

<!-- 独自フィルタを入れる場合はコメントアウト -->

<!--sec:form-login login-page="/login.jsp" default-target-url="/top.html"

authentication-failure-url="/login.jsp?error=true"/>

-->

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

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

</sec:http>

<!--

AuthenticationProviderオブジェクトのエイリアス

-->

<sec:authentication-manager alias="authenticationManagerAlias" />

<!-- 認証手形発行所 -->

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

<!--

エントリポイントの設定

-->

<bean id="authenticationProcessingFilterEntryPoint"

class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">

<property name="loginFormUrl" value="/login.jsp"/>

</bean>

<!--

認証結果をログ出力する認証処理フィルタ

-->

<bean id="authenticationProcessingFilter"

class="jp.co.soracane.security.webapp.ExtendedAuthenticationProcessingFilter">

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

<property name="authenticationManager" ref="authenticationManager" />

<property name="defaultTargetUrl" value="/top.html" />

<property name="authenticationFailureUrl" value="/login.jsp?error=true" />

</bean>

<!-- アクセス権限結果のログ出力 -->

<bean id="securityLogging" class="jp.co.soracane.security.webapp.SecurityLoggingFilter" >

<sec:custom-filter after="EXCEPTION_TRANSLATION_FILTER" />

</bean>

</beans>

【ExtendedAuthenticationProcessingFilter】

認証結果をログ出力します。

ログ出力するかどうかを制御するプロパティがあるので、ログ出力したくない場合はご利用ください。

また、このクラスは他にも機能がありますのでjavadocを見ていただければと思います。

メッセージリソースは以下のように設定し、ExtendedAuthenticationProcessingFilterのプロパティでMessageSourceを設定します。

ExtendedAuthenticationProcessingFilter.success=認証に成功しました。user={0}

ExtendedAuthenticationProcessingFilter.fail=認証に失敗しました。user={0}

【SecurityLoggingFilter】

エラー時にアクセス制御エラーをログ出力できます。

こちらもメッセージリソースを使用してメッセージを変更できます。

このフィルタを入れる位置がどうしてこの位置かは、SpringSecurityの記事を読んでいただけると分かるかと思います。

【ログ出力サンプル】

2010/01/08 00:18:17.796 INFO 認証に成功しました。user=admin

2010/01/08 00:22:52.171 INFO アクセス権限エラーが発生しました。

最後に

設定だけですので、それ程苦労しないかとは思いますが、SpringSecurityはカスタマイズしようとすると設定が煩雑になるという弱点がありますね。

このあたりは宿命だと思ってあきらめるしかありませんが、慣れればそれ程苦にはならないかなとも思います。

以下の記事も参照ください。

Created Date: 2010/01/08