今日のネタはサイトでユーザー認証を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に遷移するか
たとえばログイン後は必ずマイページを表示したいとか
直リンクとかで来た場合はログイン後にそのページに遷移させたいとかできます。
次は肝心のユーザー認証ですが、長くなるので次回に回します(笑)
コメント