1. 前言
今天我們要進(jìn)一步的的學(xué)習(xí)如何自定義配置 Spring Security 我們已經(jīng)多次提到了 WebSecurityConfigurerAdapter
鹤啡,而且我們知道 Spring Boot 中的自動配置實際上是通過自動配置包下的 SecurityAutoConfiguration
總配置類上導(dǎo)入的 Spring Boot Web 安全配置類 SpringBootWebSecurityConfiguration
來配置的漠其。所以我們就拿它開刀改淑。如果還是一頭霧水建議通過 https://felord.cn 查看 Spring Security 實戰(zhàn) 肤京。
2. 自定義 Spring Boot Web 安全配置類
我們使用我們最擅長的 Ctrl + C
随静、Ctrl + V
抄源碼中的 SpringBootWebSecurityConfiguration
士鸥,命名為我們自定義的 CustomSpringBootWebSecurityConfiguration
:
@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);
}
}
}
相信已經(jīng)有人注意到了上面 DefaultConfigurerAdapter
中我覆寫(@Override
)了三個方法,我們一般會通過自定義配置這三個方法來自定義我們的安全訪問策略豪治。
2.1 認(rèn)證管理器配置方法
void configure(AuthenticationManagerBuilder auth)
用來配置認(rèn)證管理器AuthenticationManager
洞拨。說白了就是所有 UserDetails
相關(guān)的它都管,包含 PasswordEncoder
密碼機负拟。如果你不清楚可以通過 Spring Security 中的 UserDetail 進(jìn)行了解烦衣。本文對 AuthenticationManager
不做具體分析講解,后面會有專門的文章來講這個東西 掩浙。 可通過 Spring Security 實戰(zhàn)系列 進(jìn)行學(xué)習(xí)花吟。
2.2 核心過濾器配置方法
void configure(WebSecurity web)
用來配置 WebSecurity
。而 WebSecurity
是基于 Servlet Filter
用來配置 springSecurityFilterChain
厨姚。而 springSecurityFilterChain
又被委托給了 Spring Security 核心過濾器 Bean DelegatingFilterProxy
衅澈。 相關(guān)邏輯你可以在 WebSecurityConfiguration
中找到。我們一般不會過多來自定義 WebSecurity
, 使用較多的使其ignoring()
方法用來忽略 Spring Security 對靜態(tài)資源的控制谬墙。
2.3 安全過濾器鏈配置方法
void configure(HttpSecurity http)
這個是我們使用最多的今布,用來配置 HttpSecurity
经备。 HttpSecurity
用于構(gòu)建一個安全過濾器鏈 SecurityFilterChain
。SecurityFilterChain
最終被注入核心過濾器 部默。 HttpSecurity
有許多我們需要的配置侵蒙。我們可以通過它來進(jìn)行自定義安全訪問策略。所以我們單獨開一章來講解這個東西傅蹂。
3. HttpSecurity 配置
HttpSecurity
是后面幾篇文章的重點纷闺,我們將實際操作它來實現(xiàn)一些實用功能。所以本文要著重介紹它份蝴。
3.1 默認(rèn)配置
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 中的默認(rèn)配置犁功。通過以上的配置,你的應(yīng)用具備了一下的功能:
- 所有的請求訪問都需要被授權(quán)婚夫。
- 使用
form
表單進(jìn)行登陸(默認(rèn)路徑為/login
)浸卦,也就是前幾篇我們見到的登錄頁。 - 防止
CSRF
攻擊请敦、XSS
攻擊。 - 啟用
HTTP Basic
認(rèn)證
3.2 常用方法解讀
HttpSecurity
使用了builder
的構(gòu)建方式來靈活制定訪問策略储玫。最早基于 XML
標(biāo)簽對 HttpSecurity
進(jìn)行配置∈躺福現(xiàn)在大部分使用 javaConfig
方式。常用的方法解讀如下:
方法 | 說明 |
---|---|
openidLogin() | 用于基于 OpenId 的驗證 |
headers() | 將安全標(biāo)頭添加到響應(yīng),比如說簡單的 XSS 保護(hù) |
cors() | 配置跨域資源共享( CORS ) |
sessionManagement() | 允許配置會話管理 |
portMapper() | 允許配置一個PortMapper(HttpSecurity#(getSharedObject(class)))撒穷,其他提供SecurityConfigurer的對象使用 PortMapper 從 HTTP 重定向到 HTTPS 或者從 HTTPS 重定向到 HTTP匣椰。默認(rèn)情況下,Spring Security使用一個PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443端礼,HTTP 端口80到 HTTPS 端口443 |
jee() | 配置基于容器的預(yù)認(rèn)證禽笑。 在這種情況下,認(rèn)證由Servlet容器管理 |
x509() | 配置基于x509的認(rèn)證 |
rememberMe | 允許配置“記住我”的驗證 |
authorizeRequests() | 允許基于使用HttpServletRequest限制訪問 |
requestCache() | 允許配置請求緩存 |
exceptionHandling() | 允許配置錯誤處理 |
securityContext() | 在HttpServletRequests之間的SecurityContextHolder上設(shè)置SecurityContext的管理蛤奥。 當(dāng)使用WebSecurityConfigurerAdapter時佳镜,這將自動應(yīng)用 |
servletApi() | 將HttpServletRequest方法與在其上找到的值集成到SecurityContext中。 當(dāng)使用WebSecurityConfigurerAdapter時凡桥,這將自動應(yīng)用 |
csrf() | 添加 CSRF 支持蟀伸,使用WebSecurityConfigurerAdapter時,默認(rèn)啟用 |
logout() | 添加退出登錄支持缅刽。當(dāng)使用WebSecurityConfigurerAdapter時啊掏,這將自動應(yīng)用。默認(rèn)情況是衰猛,訪問URL”/ logout”迟蜜,使HTTP Session無效來清除用戶,清除已配置的任何#rememberMe()身份驗證啡省,清除SecurityContextHolder娜睛,然后重定向到”/login?success” |
anonymous() | 允許配置匿名用戶的表示方法髓霞。 當(dāng)與WebSecurityConfigurerAdapter結(jié)合使用時,這將自動應(yīng)用微姊。 默認(rèn)情況下酸茴,匿名用戶將使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色 “ROLE_ANONYMOUS” |
formLogin() | 指定支持基于表單的身份驗證兢交。如果未指定FormLoginConfigurer#loginPage(String)薪捍,則將生成默認(rèn)登錄頁面 |
oauth2Login() | 根據(jù)外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份驗證 |
requiresChannel() | 配置通道安全。為了使該配置有用配喳,必須提供至少一個到所需信道的映射 |
httpBasic() | 配置 Http Basic 驗證 |
addFilterBefore() | 在指定的Filter類之前添加過濾器 |
addFilterAt() | 在指定的Filter類的位置添加過濾器 |
addFilterAfter() | 在指定的Filter類的之后添加過濾器 |
and() | 連接以上策略的連接器酪穿,用來組合安全策略。實際上就是"而且"的意思 |
4. 總結(jié)
到今天為止晴裹,我們已經(jīng)由淺入深學(xué)習(xí)了很多關(guān)于 Spring Security 的知識被济。已經(jīng)具有開始自定義來實現(xiàn)一些實用的功能了,在后面的文章開始我們將結(jié)合實際開發(fā)場景進(jìn)行一些實戰(zhàn)操作涧团。敬請關(guān)注公眾號:Felordcn
以第一時間獲取相關(guān)教程只磷。
關(guān)注公眾號:碼農(nóng)小胖哥,獲取更多資訊