ひよっこ。

I want to…

SpringSecurityの設定(設定+認証編)

Posted by hikaruworld : 2010 12月 17

SpringSecurityを使うと認証と認可の処理を横断的に挟み込むことが出来ます。
以前は、自力でAOPとFilterで実装してたんですが、便利なものが出たもんですね。

というわけでSecurity Namespace Configurationに従って、初期設定をしてみます。
日本語記事だとマイコミさんの概説 Springプロダクト(3) – Spring Securityでユーザ認証/アクセス制御が参考になりました

あ、ちなみにソースはlaunchpadにUPしてあります

依存ライブラリの取得

まずは、必要なjarを取得して、クラスパスを通してあげます。自分はmavenでサクッとやりました。
今回はWebアプリでFilterを用いてHTTPな認証を行うので以下の3つです。
LDAPとかOpenIDとかやりたければそちらも取ってきましょう。

  • Core – spring-security-core.jar
  • Web – spring-security-web.jar
  • Config – spring-security-config.jar

web.xmlの設定

先ほども記述したように、実際の認証処理は、Filterによって行われるため、
web.xmlに設定を記述する必要があります。

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

spriongSecurity用の設定ファイルを作成

別に設定ファイルはまとめてもかまいませんが、spring1.X時代のXML地獄という思いでがあるので、
設定ファイルは目的(というか名前空間)別に分けるようにしていますのでsecurity用の設定ファイルを作成します。
仮に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>
        <!-- Login用の画面は認証有無に関係なくアクセス出来るように -->
        <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <!-- Imageなどの静的リソースも同様に認証対象外へ -->
        <intercept-url pattern="/images/*" filters="none" />
        <!-- 全ての画面に対してROLE_USERのみアクセス可能に -->
        <intercept-url pattern="/**" access="ROLE_USER" />
        <!-- ログイン時の画面制御 -->
        <form-login login-page="/login.jsp" default-target-url="/views/home.jsp" />
        <!-- ログアウト時の画面制御 -->
        <logout logout-success-url="/login.jsp"/>
    </http>

    <authentication-manager>
        <authentication-provider>
            <!-- password-encoder hash="md5"/ --> 
            <user-service>
                <user name="bob" password="bob" authorities="ROLE_SUPERVISOR, ROLE_USER" />
                <user name="sam" password="sam" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
</beans:beans>

に関しては、

Class ‘org.springframework.security.core.userdetails.memory.UserMap’ is marked deprecated

という警告が表示されていますが、まぁ実際に利用する場合はDatabaseと連携させたりすると思いますので、この辺は放置しておきます。

余談ですが、beansにhttp://www.springframework.org/schema/securityを設定してるので、security:http
と書かずに、httpで済むようになります。ちょっとだけ楽ですね。

あとは、xsi:schemaLocationとして、

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

を読み込んでおきます。

Spring設定ファイルの定義

自分の環境では、contextConfigLocationとして、/WEB-INF/spring/root-context.xmlを読み込ませた後、
各種定義ファイルをさらにimportしているので、root-context.xmlにセキュリティ用の設定ファイルを読み込ませます。

<import resource="applicationContext-security.xml" />

ログインページの作成

認証用のLoginページを作成します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h1>Login</h1>
<form name="login_form" action="j_spring_security_check" method="post">
<div>
	<p>username <input type="text" name="j_username" /></p>
	<p>password <input type="password" name="j_password" /><br /></p>
</div>
<input type="submit" value="ログイン" /></form>
</body>
</html>

あとは起動するだけです。
すると、ログインページの/login.jspに遷移して認証画面が表示されます。

以上です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。