Spring Security | Spring Securityとは | Java Configuration

Spring Security 3.2は、Spring 3.1で追加されたJava Configurationをサポートします。XMLなしでnamespace相当の設定を記述でき、コンパイル時チェックとリファクタリングが容易になります。

Hello WorldをJava Configurationへ置き換える

web.xmlXmlWebApplicationContextの代わりにAnnotationConfigWebApplicationContextを使用します。

<context-param>
    <param-name>contextClass</param-name>
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>sample.spring.security.MySpringSecurityConfig</param-value>
</context-param>

コンテナの実装

@EnableWebSecurity
public class MySpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin();
    }

    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("devkuma").password("1234").roles("USER");
    }
}

Spring Securityを有効化する

AnnotationConfigWebApplicationContextが読み込むクラスへ@EnableWebSecurityを付与します。このアノテーションはWebSecurityConfigurationをimportし、グローバル認証を有効化します。

Spring Securityを設定する

WebSecurityConfigurerAdapterを継承し、configure(HttpSecurity)などをオーバーライドします。HttpSecurityはXMLの<http>要素に対応します。

  • authorizeRequests()でURL認可設定を開始します。
  • and()HttpSecurityを返し、メソッドチェーンを続けます。
  • formLogin()はフォーム認証を有効化します。

この例は次のXMLに相当します。

<sec:http>
    <sec:intercept-url pattern="/login" access="permitAll" />
    <sec:intercept-url pattern="/**" access="isAuthenticated()" />
    <sec:form-login />
    <sec:logout />
</sec:http>

ユーザー情報を設定する

AuthenticationManagerBuilderAuthenticationManagerの定義を支援し、UserDetailsServiceをメソッドチェーンで設定できます。Beanを直接定義することもできます。

@Bean
public UserDetailsService userDetailsService() {
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(User.withUsername("hoge").password("HOGE").roles("USER").build());
    return manager;
}