簡單來說@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
建立名稱為springSecurityFilterChain
的FilterChainProxy
的bean,此即是Spring Security的核心過濾器。SpringWebMvcImportSelector
:判斷環境中是否有DispatcherServlet
,即是否為Spring MVC專案。如果是則載入WebMvcSecurityConfiguration
。OAuth2ImportSelector
:判斷環境中是否有OAuth2的ClientRegistration
,在有OAuth2的環境才會用到。
@EnableWebSecurity
並包含了@EnableGlobalAuthentication
,其@Import
了AuthenticationConfiguration
配置,負責建立驗證相關的AuthenticationManager
與AuthenticationManagerBuilder
配置。
被標註@EnableGlobalAuthentication
的類別可用來配置AuthenticationManagerBuilder
,所以@EnableWebSecurity
也有同樣的效果。
參考:
沒有留言:
張貼留言