GAEでSpringMVCを動かしてみる3(Spring Security を試してみる)

GoogleAppEngineの勉強中です。
前回のエントリーで、SpringMVCにテンプレートエンジンのApache Velocityを組み合わせて動かしてみました。
今回は、SpringSecurityを利用して、ログイン・ログアウト機能を試してみます。

とりあえず、ユーザの管理は設定ファイルに書き込んでおくシンプルな形を試します。(ユーザデータをDBに保存したり、外部の認証サービス(GoogleAccountとかTwitterとか)を利用する、みたいなことはやらない。)

————————————————————–
使っている環境
Java JDK1.6.0_35(64bit版)
Google App Engine SDK for Java 1.7.1

Eclipse IDE for Java EE Developers_ Juno (4.2)64Bit版
The Google Plugin for Eclipse, for Eclipse 3.8/4.2 (Juno)

Spring Framework 3.2.2.RELEASE
Commons Collections 3.2.1
Commons Lang 2.6
Commons Logging 1.1.2
Apache Velocity 1.7
Spring Security 3.2.0.M1


(1)はじめに
今回はSpring Securityの機能を使って、ユーザ認証とアクセス制御を試してみます。
「SpringMVC + Apache Velocity」については、過去のエントリーを参照してください。
GAEでSpringMVCを動かしてみる | Walk on apps.
GAEでSpringMVCを動かしてみる2(テンプレートエンジンVelocityを組込む) | Walk on apps.

進め方としては、「とりあえず、まずは動かしてみる、」ってことをやってみます。
そのあと、パスワード暗号化や、ユーザごとのアクセス制御、HTTPS対応、とかを追加して「もうちょっと、きちんと動かしてみる」、つもりです。


(2)SpringFramework、Commons Loggingのダウンロード
こちらについては、前回のエントリーに書いてあるのでそちらを参照してください。
GAEでSpringMVCを動かしてみる | Walk on apps.


(3)velocity関連ライブラリのダウンロード
以下の3種類必要になります。
Apache Velocity
Commons Collections
Commons Lang

こちらについては、前回のエントリーに書いてあるのでそちらを参照してください。
GAEでSpringMVCを動かしてみる2(テンプレートエンジンVelocityを組込む) | Walk on apps.


(4)ライブラリ追加
ライブラリに追加するjarファイルは、以下の15個

commons-collections-3.2.1.jar
commons-lang-2.6.jar
commons-logging-1.1.2.jar
spring-aop-3.2.2.RELEASE.jar
spring-beans-3.2.2.RELEASE.jar
spring-context-3.2.2.RELEASE.jar
spring-context-support-3.2.2.RELEASE.jar
spring-core-3.2.2.RELEASE.jar
spring-expression-3.2.2.RELEASE.jar
spring-security-config-3.2.0.M1.jar
spring-security-core-3.2.0.M1.jar
spring-security-web-3.2.0.M1.jar
spring-web-3.2.2.RELEASE.jar
spring-webmvc-3.2.2.RELEASE.jar
velocity-1.7.jar

これらのjarファイルを、Eclipseの“war/WEB-INF/lib”フォルダに、配置します。
また、Eclipseの、「Java Build Path」に追加します。


(5)まずは動かしてみる。
Springのマニュアルと、
3. Security Namespace Configuration

こちらのサイトを参考にしました。
Spring Security hello world example
Spring Security logout example

まずは、Controllerを作成します。
リクエスト「/velocity/***」に対して、テンプレートsample.vmを返す想定にしています。
テンプレートの置き場所や、ファイル名の拡張子については、SpringのBean定義ファイルの中で定義しています。

File名:src/sample/controller/VelocityController.java

package sample.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/velocity")
public class VelocityController {

    //DI via Spring
    String message;

    @RequestMapping(value="/{path}", method = RequestMethod.GET)
    public String getMovie(@PathVariable String path, ModelMap model) {

        model.addAttribute("path", path);
        model.addAttribute("message", this.message);

        //return to .vm page, configured in mvc-dispatcher-servlet.xml, view resolver
        return "sample";
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

次に、テンプレート(.vmファイル)を作成します。

リクエスト「/velocity/***」を受け取ったControllerが、***の部分を抜き出して、path変数に入れて、テンプレートに引き渡しています。

message変数は、SpringのBean定義ファイルの中でControllerに対して初期設定しています。Controllerがその値をテンプレートに引き渡しています。

File名:war/WEB-INF/view/sample.vm

<html>
<body>
path: ${path}<br/>
message: ${message}<br/>
<p><a href="j_spring_security_logout">Logout</a></p>
</body>
</html>

次に、SpringのBean定義ファイルを作成します。
Beanの定義と、テンプレートの場所を指定しています。

File名:war/WEB-INF/spring-mvc-dispatcher-servlet.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:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.2.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                        ">

    <mvc:annotation-driven />

    <bean class="sample.controller.VelocityController">
        <property name="message">
            <value>Velocity Sample</value>
        </property>
    </bean>

    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/WEB-INF/view/"/>
    </bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="cache" value="true"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".vm"/>
    </bean>

</beans>

次に、Spring Securityの定義ファイルを作成します。
とりあえず、admin, bobというユーザを準備しておきました。パスワードは、ひとまず平文で書いておきます。

File名:war/WEB-INF/spring-security-dispatcher.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.2.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-3.1.xsd
                        ">

    <!-- Spring Security -->

    <http auto-config='true'>
        <intercept-url pattern="/**" access="ROLE_USER" />
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
              <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
              <user name="bob" password="bob" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

次に、web.xmlを修正します。

すべてのコンテキストパスに対して、DelegatingFilterProxyを適用する(フィルタする?)ように設定しています。(赤字にしています)

contextConfigLocationのところで、Spring Securityの定義ファイルを指定しています。
ここでは、Bwan定義ファイル(spring-mvc-dispatcher-servlet.xml)については指定していません。これは、servlet-nameで指定している名称spring-mvc-dispatcherに紐づいた名前のファイルを、自動的に読み込みに行ってくれるから。(というか、名前を紐づけないやり方がわからない。。)

File名:war/WEB-INF/web.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- Spring MVC -->
    <servlet>
        <servlet-name>spring-mvc-dispatcher</servlet-name>
        <servlet-class>
                    org.springframework.web.servlet.DispatcherServlet
                </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

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

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring-security-dispatcher.xml
        </param-value>
    </context-param>

    <!-- Spring Security -->
    <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>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

appengine-web.xmlへ設定追加
GoogleAppEngineでは、デフォルトではセッションが使用できないようです。なので、appengine-web.xmlに以下の設定を追加します

<sessions-enabled>true</sessions-enabled>

作成したソースコードの配置場所をまとめると、こんな感じになっています。
spring_security01

自PC上で、ためしにアプリ起動
http://localhost:8888/velocity/test  にアクセスしてみます。ログイン画面が出てきました。
spring_security02

ユーザ「bob」でログインすると、画面が出ました!!
spring_security03

GAE上にDeployしても、きちんと動きました。よかった。


(6)もうちょっと、きちんと動かしてみる
:  :
:  :
記事が長くなってきたので、ここから先は次回のエントリーに書くことにします。
あと、ソースを張付けるのが大変になってきたので、GitHubを導入してみたいと思う!
こちら→ GAEでSpringMVCを動かしてみる4(続 Spring Security を試してみる) | Walk on apps.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s