今天咱們要進一步的的學習如何自定義配置 Spring Security 咱們已經屢次提到了 WebSecurityConfigurerAdapter
,並且咱們知道 Spring Boot 中的自動配置其實是經過自動配置包下的 SecurityAutoConfiguration
總配置類上導入的 Spring Boot Web 安全配置類 SpringBootWebSecurityConfiguration
來配置的。因此咱們就拿它開刀。若是仍是一頭霧水建議經過 https://felord.cn 查看 Spring Security 實戰 。html
咱們使用咱們最擅長的 Ctrl + C
、Ctrl + V
抄源碼中的 SpringBootWebSecurityConfiguration
,命名爲咱們自定義的 CustomSpringBootWebSecurityConfiguration
:java
@Configuration
@ConditionalOnClass(WebSecurityConfigurerAdapter.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class CustomSpringBootWebSecurityConfiguration {
@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER)
static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
super.configure(auth);
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
}
}複製代碼
相信已經有人注意到了上面 DefaultConfigurerAdapter
中我覆寫(@Override
)了三個方法,咱們通常會經過自定義配置這三個方法來自定義咱們的安全訪問策略。web
void configure(AuthenticationManagerBuilder auth)
用來配置認證管理器AuthenticationManager
。說白了就是全部 UserDetails
相關的它都管,包含 PasswordEncoder
密碼機。若是你不清楚能夠經過 Spring Security 中的 UserDetail 進行了解。本文對 AuthenticationManager
不作具體分析講解,後面會有專門的文章來說這個東西 。 可經過 Spring Security 實戰系列 進行學習。spring
void configure(WebSecurity web)
用來配置 WebSecurity
。而 WebSecurity
是基於 Servlet Filter
用來配置 springSecurityFilterChain
。而 springSecurityFilterChain
又被委託給了 Spring Security 核心過濾器 Bean DelegatingFilterProxy
。 相關邏輯你能夠在 WebSecurityConfiguration
中找到。咱們通常不會過多來自定義 WebSecurity
, 使用較多的使其ignoring()
方法用來忽略 Spring Security 對靜態資源的控制。跨域
void configure(HttpSecurity http)
這個是咱們使用最多的,用來配置 HttpSecurity
。 HttpSecurity
用於構建一個安全過濾器鏈 SecurityFilterChain
。SecurityFilterChain
最終被注入核心過濾器 。 HttpSecurity
有許多咱們須要的配置。咱們能夠經過它來進行自定義安全訪問策略。因此咱們單獨開一章來說解這個東西。緩存
HttpSecurity
是後面幾篇文章的重點,咱們將實際操做它來實現一些實用功能。因此本文要着重介紹它。安全
protected void configure(HttpSecurity http) throws Exception {
logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin().and()
.httpBasic();
}複製代碼
上面是 Spring Security 在 Spring Boot 中的默認配置。經過以上的配置,你的應用具有了一下的功能:session
form
表單進行登錄(默認路徑爲/login
),也就是前幾篇咱們見到的登陸頁。 CSRF
攻擊、 XSS
攻擊。 HTTP Basic
認證 HttpSecurity
使用了builder
的構建方式來靈活制定訪問策略。最先基於 XML
標籤對 HttpSecurity
進行配置。如今大部分使用 javaConfig
方式。經常使用的方法解讀以下:app
方法 | 說明 |
---|---|
openidLogin() | 用於基於 OpenId 的驗證 |
headers() |
將安全標頭添加到響應,好比說簡單的 XSS 保護 |
cors() | 配置跨域資源共享( CORS ) |
sessionManagement() | 容許配置會話管理 |
portMapper() | 容許配置一個PortMapper(HttpSecurity#(getSharedObject(class))),其餘提供SecurityConfigurer的對象使用 PortMapper 從 HTTP 重定向到 HTTPS 或者從 HTTPS 重定向到 HTTP。默認狀況下,Spring Security使用一個PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443,HTTP 端口80到 HTTPS 端口443 |
jee() | 配置基於容器的預認證。 在這種狀況下,認證由Servlet容器管理 |
x509() | 配置基於x509的認證 |
rememberMe | 容許配置「記住我」的驗證 |
authorizeRequests() | 容許基於使用HttpServletRequest限制訪問 |
requestCache() | 容許配置請求緩存 |
exceptionHandling() | 容許配置錯誤處理 |
securityContext() | 在HttpServletRequests之間的SecurityContextHolder上設置SecurityContext的管理。 當使用WebSecurityConfigurerAdapter時,這將自動應用 |
servletApi() | 將HttpServletRequest方法與在其上找到的值集成到SecurityContext中。 當使用WebSecurityConfigurerAdapter時,這將自動應用 |
csrf() | 添加 CSRF 支持,使用WebSecurityConfigurerAdapter時,默認啓用 |
logout() | 添加退出登陸支持。當使用WebSecurityConfigurerAdapter時,這將自動應用。默認狀況是,訪問URL」/ logout」,使HTTP Session無效來清除用戶,清除已配置的任何#rememberMe()身份驗證,清除SecurityContextHolder,而後重定向到」/login?success」 |
anonymous() | 容許配置匿名用戶的表示方法。 當與WebSecurityConfigurerAdapter結合使用時,這將自動應用。 默認狀況下,匿名用戶將使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,幷包含角色 「ROLE_ANONYMOUS」 |
formLogin() | 指定支持基於表單的身份驗證。若是未指定FormLoginConfigurer#loginPage(String),則將生成默認登陸頁面 |
oauth2Login() | 根據外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份驗證 |
requiresChannel() | 配置通道安全。爲了使該配置有用,必須提供至少一個到所需信道的映射 |
httpBasic() | 配置 Http Basic 驗證 |
addFilterBefore() | 在指定的Filter類以前添加過濾器 |
addFilterAt() | 在指定的Filter類的位置添加過濾器 |
addFilterAfter() | 在指定的Filter類的以後添加過濾器 |
and() | 鏈接以上策略的鏈接器,用來組合安全策略。實際上就是"並且"的意思 |
到今天爲止,咱們已經由淺入深學習了不少關於 Spring Security 的知識。已經具備開始自定義來實現一些實用的功能了,在後面的文章開始咱們將結合實際開發場景進行一些實戰操做。敬請關注公衆號:Felordcn
以第一時間獲取相關教程。cors
關注公衆號:Felordcn獲取更多資訊