網頁

2019/10/3

Spring Security @EnableWebSecurity的作用

簡單來說@EnableWebSecurity是用來啟用Spring Security所需的各項配置。


自訂Spring Security配置時,通常會建立一個類別繼承WebSecurityConfigurerAdapter並覆寫配置方法如configure()來修改/自訂Spring Security的預設安全配置,所以@EnableWebSecurity會與此Spring Security配置類放在一起。例如下面即為一個自訂的Spring Security配置類:

package com.abc.demo.config;

import org.springframework.context.annotation.Bean;
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;

@EnableWebSecurity
public class DemoWebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        ... // AuthenticationManagerBuilder的各種配置
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        ... // HttpSecurity各種配置
    }

}

@EnableWebSecurity本身即是一個@Configuration的多組合配置,原始碼如下:

EnableWebSecurity

@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({ WebSecurityConfiguration.class,
        SpringWebMvcImportSelector.class,
        OAuth2ImportSelector.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {

    boolean debug() default false;
}

@EnableWebSecurity@Import了三個配置類:

  • WebSecurityConfiguration:負責以WebSecurity建立名稱為springSecurityFilterChainFilterChainProxy的bean,此即是Spring Security的核心過濾器。
  • SpringWebMvcImportSelector:判斷環境中是否有DispatcherServlet,即是否為Spring MVC專案。如果是則載入WebMvcSecurityConfiguration
  • OAuth2ImportSelector:判斷環境中是否有OAuth2的ClientRegistration,在有OAuth2的環境才會用到。

@EnableWebSecurity並包含了@EnableGlobalAuthentication,其@ImportAuthenticationConfiguration配置,負責建立驗證相關的AuthenticationManagerAuthenticationManagerBuilder配置。

被標註@EnableGlobalAuthentication的類別可用來配置AuthenticationManagerBuilder,所以@EnableWebSecurity也有同樣的效果。


參考:

沒有留言:

張貼留言