SpringSecurity定義多個(gè)過(guò)濾器鏈的操作代碼
簡(jiǎn)介
- Spring Security 是 Spring家族中的一個(gè)安全管理框架。相比與另外一個(gè)安全框架Shiro,它提供了更豐富的功能,社區(qū)資源也比Shiro豐富。
- 一般來(lái)說(shuō)中大型的項(xiàng)目都是使用SpringSecurity來(lái)做安全框架。小項(xiàng)目有Shiro的比較多,因?yàn)橄啾扰cSpringSecurity,Shiro的上手更加的簡(jiǎn)單。
? 一般Web應(yīng)用的需要進(jìn)行認(rèn)證和授權(quán)。
- 認(rèn)證:驗(yàn)證當(dāng)前訪問(wèn)系統(tǒng)的是不是本系統(tǒng)的用戶(hù),并且要確認(rèn)具體是哪個(gè)用戶(hù)
- ? 授權(quán):經(jīng)過(guò)認(rèn)證后判斷當(dāng)前用戶(hù)是否有權(quán)限進(jìn)行某個(gè)操作
? 而認(rèn)證和授權(quán)也是SpringSecurity作為安全框架的核心功能。
在Spring Security中可以定義多個(gè)過(guò)濾器鏈,一個(gè)WebSerityConfigurerAdapter的實(shí)例就可以配置一個(gè)過(guò)濾器鏈,我們只需要配置多個(gè)WebSerityConfigurerAdapter的實(shí)例即可

可以看到,當(dāng)請(qǐng)求到達(dá) FilterChainProxy 之后,F(xiàn)ilterChainProxy 會(huì)根據(jù)請(qǐng)求的路徑,將請(qǐng)求轉(zhuǎn)發(fā)到不同的 過(guò)濾器鏈 上面去,不同的 過(guò)濾器鏈 對(duì)應(yīng)了不同的過(guò)濾器,也就是不同的請(qǐng)求將經(jīng)過(guò)不同的過(guò)濾器。
@Configuration
public class SecurityConfig {
@Bean
protected UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("javaboy").password("{bcrypt}$2a$10$Sb1gAUH4wwazfNiqflKZve4Ubh.spJcxgHG8Cp29DeGya5zsHENqi").roles("admin", "aaa", "bbb").build());
manager.createUser(User.withUsername("sang").password("{noop}123").roles("admin").build());
manager.createUser(User.withUsername("吳名氏").password("{MD5}{Wucj/L8wMTMzFi3oBKWsETNeXbMFaHZW9vCK9mahMHc=}4d43db282b36d7f0421498fdc693f2a2").roles("user", "aaa", "bbb").build());
return manager;
}
@Configuration
@Order(1)
static class DefaultWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/foo/**")
.authorizeRequests()
.anyRequest().hasRole("admin")
.and()
.csrf().disable();
}
}
@Configuration
@Order(2)
static class DefaultWebSecurityConfig2 extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/bar/**")
.authorizeRequests()
.anyRequest().hasRole("user")
.and()
.formLogin()
.permitAll()
.and()
.csrf().disable();
}
}
}
說(shuō)明:
- 首先,SecurityConfig 不再需要繼承自 WebSecurityConfigurerAdapter了,只是作為一個(gè)普通的配置類(lèi),加上 @Configuration 注解即可。
- 提供 UserDetailsService 實(shí)例,相當(dāng)于是我們的數(shù)據(jù)源。
- 創(chuàng)建靜態(tài)內(nèi)部類(lèi)繼承 WebSecurityConfigurerAdapter 類(lèi),同時(shí)用 @Configuration
- 注解標(biāo)記靜態(tài)內(nèi)部類(lèi)是一個(gè)配置類(lèi),配置類(lèi)里邊的代碼就和之前的一樣了,無(wú)需贅述。
- 每一個(gè)靜態(tài)內(nèi)部類(lèi)相當(dāng)于就是一個(gè)過(guò)濾器鏈的配置。
- 注意在靜態(tài)內(nèi)部類(lèi)里邊,我沒(méi)有使用 http.authorizeRequests()
- 開(kāi)始,http.authorizeRequests() 配置表示該過(guò)濾器鏈過(guò)濾的路徑是 /。在靜態(tài)內(nèi)部類(lèi)里邊,我是用了
- http.antMatcher("/bar/") 開(kāi)啟配置,表示將當(dāng)前過(guò)濾器鏈的攔截范圍限定在
- /bar/**。所以有的時(shí)候authorizeRequests()不能放在第一個(gè)位置
- 當(dāng)存在多個(gè)過(guò)濾器鏈的時(shí)候,必然會(huì)有一個(gè)優(yōu)先級(jí)的問(wèn)題,所以每一個(gè)過(guò)濾器鏈的配置類(lèi)上通過(guò) @Order(2)
- 注解來(lái)標(biāo)記優(yōu)先級(jí)。數(shù)字越大優(yōu)先級(jí)越低。請(qǐng)求會(huì)先進(jìn)入優(yōu)先級(jí)高的過(guò)濾器鏈中。
到此這篇關(guān)于SpringSecurity定義多個(gè)過(guò)濾器鏈的文章就介紹到這了,更多相關(guān)SpringSecurity多個(gè)過(guò)濾器鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringSecurity的安全過(guò)濾器鏈功能詳解
- SpringSecurity中內(nèi)置過(guò)濾器的使用小結(jié)
- springSecurity自定義登錄接口和JWT認(rèn)證過(guò)濾器的流程
- SpringSecurity中的Filter Chain(過(guò)濾器鏈)
- idea如何debug看springsecurity的過(guò)濾器順序
- SpringSecurity request過(guò)濾問(wèn)題示例小結(jié)
- springSecurity之如何添加自定義過(guò)濾器
- SpringSecurity學(xué)習(xí)之自定義過(guò)濾器的實(shí)現(xiàn)代碼
- springSecurity過(guò)濾web請(qǐng)求的項(xiàng)目實(shí)踐
相關(guān)文章
Spring Boot中Redis數(shù)據(jù)庫(kù)的使用實(shí)例
Spring Boot中除了對(duì)常用的關(guān)系型數(shù)據(jù)庫(kù)提供了優(yōu)秀的自動(dòng)化支持之外,對(duì)于很多NoSQL數(shù)據(jù)庫(kù)一樣提供了自動(dòng)化配置的支持。本篇文章主要介紹了Spring Boot中Redis的使用實(shí)例代碼,有興趣的開(kāi)業(yè)了解一下。2017-04-04
Java如何實(shí)現(xiàn)通過(guò)證書(shū)訪問(wèn)Https請(qǐng)求
這篇文章主要介紹了Java如何實(shí)現(xiàn)通過(guò)證書(shū)訪問(wèn)Https請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java利用redis zset實(shí)現(xiàn)延時(shí)任務(wù)詳解
zset作為redis的有序集合數(shù)據(jù)結(jié)構(gòu)存在,排序的依據(jù)就是score。本文就將利用zset score這個(gè)排序的這個(gè)特性,來(lái)實(shí)現(xiàn)延時(shí)任務(wù),感興趣的可以了解一下2022-08-08
Mybatis如何使用正則模糊匹配多個(gè)數(shù)據(jù)
這篇文章主要介紹了Mybatis如何使用正則模糊匹配多個(gè)數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
關(guān)于@Transactional事務(wù)表被鎖的問(wèn)題及解決
這篇文章主要介紹了關(guān)于@Transactional事務(wù)表被鎖的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
實(shí)例分析java中重載與重寫(xiě)的區(qū)別
這篇文章主要介紹了實(shí)例分析java中重載與重寫(xiě)的區(qū)別,需要的朋友可以參考下2014-07-07
SpringSecurity請(qǐng)求授權(quán)規(guī)則配置與注解詳解
這篇文章主要介紹了SpringSecurity請(qǐng)求授權(quán)規(guī)則配置與注解詳解,我們常使用@Secured與@PreAuthorize兩個(gè)注解在進(jìn)入方法前進(jìn)行角色、權(quán)限的控制,進(jìn)入方法前數(shù)據(jù)的過(guò)濾@PreFilter注解偶爾會(huì)看到,需要的朋友可以參考下2023-12-12
解讀@ConfigurationProperties的基本用法
這篇文章主要介紹了@ConfigurationProperties的基本用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
SpringBoot整合WebSocket實(shí)現(xiàn)聊天室流程全解
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。本文將通過(guò)SpringBoot集成WebSocket實(shí)現(xiàn)簡(jiǎn)易聊天室,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-01-01

