SpringSecurityでお手軽ユーザー認証

Java

今日のネタはサイトでユーザー認証をSpringSecurityで簡単に実装する方法です。

SpringSecurityとは、認証と認可を扱うSpringSourceのフレームワークです。

まずは、mavenでSpringSecurityを取り込みます。

<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-core</artifactId>
	<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-web</artifactId>
	<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-config</artifactId>
	<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-crypto</artifactId>
	<version>3.2.2.RELEASE</version>
</dependency>

こんな感じにdependencyを定義します。

SpringSecurityはfilerで動くので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>

そしたらあとは認証の設定をXMLで設定します。
別途spring-security.xmlとか用意して本体でimportがおすすめです。

デフォルトの名前空間をbenasとsecurityのどっちにするかという問題がありますが
個人的には設定ファイルごとに定義を変えるのがめんどいのでbeansをデフォルトにしてます。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">

あとは認可の設定だけで一応は動きます。
※beansをデフォルト名前空間にしているので外側のタグごとにxmlns定義が必要になります。

<http xmlns="http://www.springframework.org/schema/security">
  <intercept-url pattern="/**" access="ROLE_USER" />
  <form-login />
  <logout />
</http>

全ページROLE_USERを持っているユーザーだけアクセスできるようになります。
ただ、これだけだとだれもROLE_USER持っていないので認証の定義をします。

<authentication-manager xmlns="http://www.springframework.org/schema/security">
  <authentication-provider>
    <user-service>
      <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
      <user name="bob" password="bobspassword" authorities="ROLE_USER" />
    </user-service>
  </authentication-provider>
</authentication-manager>

SpringSecurityのサンプルだとこれだけで用意されているForm画面が表示され
IDとパスワードを入れると認証後の画面が表示されます。
ここまで動いたらあとは個々にカスタマイズしていきます。

まずは認可が必要なページとそうでないページの出し分けをしてみます。

認可設定のintercept-urlの定義を以下のようにします。

<!-- /memberに対してROLE_USERのみアクセス可能に -->
<intercept-url pattern="/member/**" access="ROLE_USER" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />

こうすると/member/以下のURLは認証がかかり、それ以外はIS_AUTHENTICATED_ANONYMOUSLYによってだれでもアクセスできるようになります。
ログインFormのページ、ログイン後のURL、ログアウトのページも以下のように追加します。

<!-- ログイン時の画面制御 -->
<form-login login-page="/login" default-target-url="/member" always-use-default-target="false" />
<!-- ログアウト時の画面制御 -->
<logout logout-success-url="/" />

default-target-url:ログイン後のURL
always-use-default-target:ログイン後は必ずデフォルトURLに遷移するか

たとえばログイン後は必ずマイページを表示したいとか
直リンクとかで来た場合はログイン後にそのページに遷移させたいとかできます。

次は肝心のユーザー認証ですが、長くなるので次回に回します(笑)

コメント

タイトルとURLをコピーしました