Spring Security 在 Servlet 請(qǐng)求中實(shí)現(xiàn)鑒權(quán)
1. 前言
Servlet 是 Java Web 應(yīng)用的最常見場(chǎng)景,Spring Security 對(duì) Servlet 的權(quán)限認(rèn)定過程實(shí)現(xiàn)了規(guī)范化和流程化。
本節(jié)主要討論在 Servlet 應(yīng)用中,如何通過 Spring Security 實(shí)現(xiàn)鑒權(quán)。
2. Servlet 權(quán)限控制的流程
Servlet 鑒權(quán)主要圍繞著 FilterSecurityInterceptor 類展開,該類作為一個(gè)安全過濾器,被放置在 FilterChainProxy 中。

圖 1. Servlet 請(qǐng)求鑒權(quán)流程
具體流程如下:
FilterSecurityInterceptor從SecurityContextHolder中獲取Authentication對(duì)象;FilterSecurityInterceptor從HttpServletRequest、HttpServletREsponse、FilterChain中創(chuàng)建FilterInvocation對(duì)象;- 將創(chuàng)建的
FilterInvocation對(duì)象傳遞給SecurityMetadataSource用來獲取ConfigAttribute對(duì)象集合; - 最后,將
Authentication、FilterInvocation和ConfigAttribute對(duì)象傳遞給AccessDecisionManager實(shí)例驗(yàn)證權(quán)限:- 如果驗(yàn)證失敗,將拋出
AccessDeniedException異常,并由ExceptionTranslationFilter接收并處理; - 如果驗(yàn)證通過,
FilterSecurityInterceptor將控制權(quán)交還給FilterChain,使程序繼續(xù)執(zhí)行。
- 如果驗(yàn)證失敗,將拋出
3. Servlet 權(quán)限控制的配置實(shí)現(xiàn)
默認(rèn)情況下,Spring Security 的權(quán)限要求所有的請(qǐng)求都需要首先通過認(rèn)證。相當(dāng)于以下配置描述:
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.authorizeRequests(authorize -> authorize
.anyRequest().authenticated()
);
}
如果我們需要配置 Spring Security 對(duì)不同請(qǐng)求有不同的處理規(guī)則時(shí),可通過以下方式修改配置:
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.authorizeRequests(authorize -> authorize
.mvcMatchers("/resources/**", "/signup", "/about").permitAll()
.mvcMatchers("/admin/**").hasRole("ADMIN")
.mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.anyRequest().denyAll()
);
}
以上這段代碼實(shí)現(xiàn)了如下功能:
- 指定了多種規(guī)則,每種規(guī)則按照其配置的順序決定優(yōu)先級(jí);
- 匹配了多個(gè) URL 規(guī)則,對(duì)于
/resources、/signup、/about允許任何用戶訪問; - 任何以
/admin/開頭的地址都要求用戶具有管理員權(quán)限ROLE_ADMIN,其中ROLE_前綴是 Spring Security 默認(rèn)添加的,用戶無需做特殊處理; - 任何以
/db/為開頭的地址需要同時(shí)擁有ROLE_ADMIN和ROLE_DBA角色; - 沒有被上述 URL 地址匹配的地址都將被禁止訪問,加上這一條非常有助于提升系統(tǒng)的安全性。
4. 小結(jié)
本節(jié)討論了如何用 Spring Security 規(guī)范化 Servlet 鑒權(quán)過程:
- Spring Security 對(duì) Servlet 請(qǐng)求的權(quán)限控制,主要依賴于
FilterSecurityInterceptor實(shí)現(xiàn); - Spring Security 默認(rèn)對(duì)每一個(gè) Servlet 請(qǐng)求都要求用戶已通過認(rèn)證;
- Spring Security 支持對(duì) Servlet 的不同 URL 規(guī)則配置不同的權(quán)限規(guī)則。
下節(jié)我們討論如何通過「訪問控制表達(dá)式」實(shí)現(xiàn)多樣化的鑒權(quán)規(guī)則。
童雷 ·
2025 imooc.com All Rights Reserved |