Spring SecurityのHello World Annotationの例

Spring Security Hello Worldアノテーションの例

security

プレビューpostでは、XMLファイルを使用してSpringMVC環境でSpringSecurityを構成しています。 このチュートリアルでは、以前のXMLベースのSpring Securityプロジェクトを純粋なSpringアノテーションプロジェクトに変換する方法を示します。

使用される技術:

  1. Spring 3.2.8.RELEASE

  2. Spring Security 3.2.3.RELEASE

  3. Eclipse 4.2

  4. JDK 1.6

  5. メーベン3

  6. Tomcat 7(サーブレット3.x)

いくつかのメモ

  1. このチュートリアルでは、WebApplicationInitializerを使用してSpring Context Loaderを自動的にロードします。これは、Tomcat7やJetty8などのサーブレット3.xコンテナでのみサポートされています。

  2. WebApplicationInitializerを使用しているため、web.xmlファイルは必要ありません。

  3. Spring Securityアノテーションは、Tomcat 6などの古いサーブレット2.xコンテナでサポートされています。 従来のXMLファイルを使用してSpringコンテキストをロードする場合、このチュートリアルは、Tomcat 6などのサーブレット2.xコンテナーにデプロイできます。

1. プロジェクトのデモ

それがどのように機能するか見てください。

2. ディレクトリ構造

このチュートリアルの最終的なディレクトリ構造を確認してください。

spring-security-helloworld-annotation-directory

3. Springセキュリティの依存関係

Springセキュリティを使用するには、spring-security-webspring-security-configが必要です。

pom.xml

    
        1.6
        3.2.8.RELEASE
        3.2.3.RELEASE
        1.2
    

    

        
        
            org.springframework
            spring-core
            ${spring.version}
        

        
            org.springframework
            spring-web
            ${spring.version}
        

        
            org.springframework
            spring-webmvc
            ${spring.version}
        

        
        
            org.springframework.security
            spring-security-web
            ${spring.security.version}
        

        
            org.springframework.security
            spring-security-config
            ${spring.security.version}
        

        
        
            jstl
            jstl
            ${jstl.version}
        

    

4. Spring MVC Webアプリケーション

シンプルなコントローラー:

  1. URL =/welcomeまたは/の場合、helloページを返します。

  2. URL =/adminの場合、管理ページを返します。

  3. URL =/dbaの場合、管理ページを返します。

後で、/admin/dbaのURLを保護します。

HelloController.java

package com.example.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {

    @RequestMapping(value = { "/", "/welcome**" }, method = RequestMethod.GET)
    public ModelAndView welcomePage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is welcome page!");
        model.setViewName("hello");
        return model;

    }

    @RequestMapping(value = "/admin**", method = RequestMethod.GET)
    public ModelAndView adminPage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is protected page - Admin Page!");
        model.setViewName("admin");

        return model;

    }

    @RequestMapping(value = "/dba**", method = RequestMethod.GET)
    public ModelAndView dbaPage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is protected page - Database Page!");
        model.setViewName("admin");

        return model;

    }

}

2つのJSPページ。

hello.jsp

<%@page session="false"%>


    

Title : ${title}

Message : ${message}

admin.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>


    

Title : ${title}

Message : ${message}

Welcome : ${pageContext.request.userPrincipal.name} | " > Logout

5. Spring Securityの構成

5.1 Spring Security構成ファイルを作成し、@EnableWebSecurityで注釈を付けます

SecurityConfig.java

package com.example.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.inMemoryAuthentication().withUser("example").password("123456").roles("USER");
      auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
      auth.inMemoryAuthentication().withUser("dba").password("123456").roles("DBA");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
        .and().formLogin();

    }
}

Spring Security xmlファイルに相当するもの:

    
        
        
    

    
      
        
        
        
        
        
      
    

5.2AbstractSecurityWebApplicationInitializerを拡張するクラスを作成すると、springSecurityFilterChainが自動的にロードされます。

SpringSecurityInitializer.java

package com.example.config.core;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
   //do nothing
}

web.xmlファイルのSpring Securityに相当します:

    
        springSecurityFilterChain
        org.springframework.web.filter.DelegatingFilterProxy
                
    

    
        springSecurityFilterChain
        /*
    

6. Spring MVC設定

6.1 Configクラス。ビューのテクノロジーを定義し、SecurityConfig.javaより上にインポートします。

AppConfig.java

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@EnableWebMvc
@Configuration
@ComponentScan({ "com.example.web.*" })
@Import({ SecurityConfig.class })
public class AppConfig {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver
                          = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

}

Spring XMLファイルに相当するもの:

    

    
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

6.2Initializerクラスを作成して、すべてをロードします。

SpringMvcInitializer.java

package com.example.config.core;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import com.example.config.AppConfig;

public class SpringMvcInitializer
       extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { AppConfig.class };
    }

    @Override
    protected Class[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

完了しました。

Note
サーブレット3.xコンテナ環境では+ SpringコンテナはInitializerクラスを自動的に検出してロードします。

7. Demo

spring-security-helloworld-annotation-welcome

7.2 Try to access /admin page, Spring Security will intercept the request and redirect to /login, and a default login form is displayed.

spring-security-helloworld-annotation-login

7.3. ユーザー名とパスワードが正しくない場合、エラーメッセージが表示され、SpringはこのURL/login?errorにリダイレクトします。

spring-security-helloworld-annotation-login-error

7.4. ユーザー名とパスワードが正しい場合、Springはリクエストを元のリクエストされたURLにリダイレクトし、ページを表示します。

spring-security-helloworld-annotation-admin

7.5. 権限のないユーザーの場合、Springは403アクセス拒否ページを表示します。 たとえば、ユーザー「example」または「dba」は、/adminのURLにアクセスしようとします。

spring-security-helloworld-annotation-403

ソースコードをダウンロード

ダウンロード–spring-security-helloworld-annotation.zip(12 KB)