SpringBoot2.7?WebSecurityConfigurerAdapter類(lèi)過(guò)期配置
前言
進(jìn)入到 SpringBoot2.7 時(shí)代,有小伙伴發(fā)現(xiàn)有一個(gè)常用的類(lèi)忽然過(guò)期了:

在 Spring Security 時(shí)代,這個(gè)類(lèi)可太重要了。過(guò)期的類(lèi)當(dāng)然可以繼續(xù)使用,但是你要是決定別扭,只需要稍微看一下注釋?zhuān)旧暇兔靼自撛趺赐媪恕?/p>
WebSecurityConfigurerAdapter 的注釋
我們來(lái)看下 WebSecurityConfigurerAdapter 的注釋?zhuān)?/p>

從這段注釋中我們大概就明白了咋回事了。
配置Spring Security
以前我們自定義類(lèi)繼承自 WebSecurityConfigurerAdapter 來(lái)配置我們的 Spring Security,我們主要是配置兩個(gè)東西:
- configure(HttpSecurity)
- configure(WebSecurity)
前者主要是配置 Spring Security 中的過(guò)濾器鏈,后者則主要是配置一些路徑放行規(guī)則。
現(xiàn)在在 WebSecurityConfigurerAdapter 的注釋中,人家已經(jīng)把意思說(shuō)的很明白了:
- 以后如果想要配置過(guò)濾器鏈,可以通過(guò)自定義 SecurityFilterChain Bean 來(lái)實(shí)現(xiàn)。
- 以后如果想要配置 WebSecurity,可以通過(guò) WebSecurityCustomizer Bean 來(lái)實(shí)現(xiàn)。
那么接下來(lái)我們就通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看下。
引入Web和Spring Security依賴(lài)
首先我們新建一個(gè) Spring Boot 工程,引入 Web 和 Spring Security 依賴(lài),注意 Spring Boot 選擇最新的 2.7。

接下來(lái)我們提供一個(gè)簡(jiǎn)單的測(cè)試接口,如下:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello 江南一點(diǎn)雨!";
}
}
小伙伴們知道,在 Spring Security 中,默認(rèn)情況下,只要添加了依賴(lài),我們項(xiàng)目的所有接口就已經(jīng)被統(tǒng)統(tǒng)保護(hù)起來(lái)了,現(xiàn)在啟動(dòng)項(xiàng)目,訪(fǎng)問(wèn) /hello 接口,就需要登錄之后才可以訪(fǎng)問(wèn),登錄的用戶(hù)名是 user,密碼則是隨機(jī)生成的,在項(xiàng)目的啟動(dòng)日志中。
現(xiàn)在我們的第一個(gè)需求是使用自定義的用戶(hù),而不是系統(tǒng)默認(rèn)提供的,這個(gè)簡(jiǎn)單,我們只需要向 Spring 容器中注冊(cè)一個(gè) UserDetailsService 的實(shí)例即可,像下面這樣:
@Configuration
public class SecurityConfig {
@Bean
UserDetailsService userDetailsService() {
InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
users.createUser(User.withUsername("江南一點(diǎn)雨").password("{noop}123").roles("admin").build());
return users;
}
}
這就可以了。
當(dāng)然我現(xiàn)在的用戶(hù)是存在內(nèi)存中的,如果你的用戶(hù)是存在數(shù)據(jù)庫(kù)中,那么只需要提供 UserDetailsService 接口的實(shí)現(xiàn)類(lèi)并注入 Spring 容器即可,這個(gè)之前在 vhr 視頻中講過(guò)多次了(公號(hào)后臺(tái)回復(fù) 666 有視頻介紹),這里就不再贅述了。
重寫(xiě)configure(WebSecurity方法進(jìn)行配置
但是假如說(shuō)我希望 /hello 這個(gè)接口能夠匿名訪(fǎng)問(wèn),并且我希望這個(gè)匿名訪(fǎng)問(wèn)還不經(jīng)過(guò) Spring Security 過(guò)濾器鏈,要是在以前,我們可以重寫(xiě) configure(WebSecurity) 方法進(jìn)行配置,但是現(xiàn)在,得換一種玩法:
@Configuration
public class SecurityConfig {
@Bean
UserDetailsService userDetailsService() {
InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
users.createUser(User.withUsername("江南一點(diǎn)雨").password("{noop}123").roles("admin").build());
return users;
}
@Bean
WebSecurityCustomizer webSecurityCustomizer() {
return new WebSecurityCustomizer() {
@Override
public void customize(WebSecurity web) {
web.ignoring().antMatchers("/hello");
}
};
}
}
以前位于 configure(WebSecurity) 方法中的內(nèi)容,現(xiàn)在位于 WebSecurityCustomizer Bean 中,該配置的東西寫(xiě)在這里就可以了。
定制登錄頁(yè)面參數(shù)等
那如果我還希望對(duì)登錄頁(yè)面,參數(shù)等,進(jìn)行定制呢?繼續(xù)往下看:
@Configuration
public class SecurityConfig {
@Bean
UserDetailsService userDetailsService() {
InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
users.createUser(User.withUsername("江南一點(diǎn)雨").password("{noop}123").roles("admin").build());
return users;
}
@Bean
SecurityFilterChain securityFilterChain() {
List<Filter> filters = new ArrayList<>();
return new DefaultSecurityFilterChain(new AntPathRequestMatcher("/**"), filters);
}
}
Spring Security 的底層實(shí)際上就是一堆過(guò)濾器,所以我們之前在 configure(HttpSecurity) 方法中的配置,實(shí)際上就是配置過(guò)濾器鏈。現(xiàn)在過(guò)濾器鏈的配置,我們通過(guò)提供一個(gè) SecurityFilterChain Bean 來(lái)配置過(guò)濾器鏈,SecurityFilterChain 是一個(gè)接口,這個(gè)接口只有一個(gè)實(shí)現(xiàn)類(lèi) DefaultSecurityFilterChain,構(gòu)建 DefaultSecurityFilterChain 的第一個(gè)參數(shù)是攔截規(guī)則,也就是哪些路徑需要攔截,第二個(gè)參數(shù)則是過(guò)濾器鏈,這里我給了一個(gè)空集合,也就是我們的 Spring Security 會(huì)攔截下所有的請(qǐng)求,然后在一個(gè)空集合中走一圈就結(jié)束了,相當(dāng)于不攔截任何請(qǐng)求。
此時(shí)重啟項(xiàng)目,你會(huì)發(fā)現(xiàn) /hello 也是可以直接訪(fǎng)問(wèn)的,就是因?yàn)檫@個(gè)路徑不經(jīng)過(guò)任何過(guò)濾器。
其實(shí)我覺(jué)得目前這中新寫(xiě)法比以前老的寫(xiě)法更直觀,更容易讓大家理解到 Spring Security 底層的過(guò)濾器鏈工作機(jī)制。
有小伙伴會(huì)說(shuō),這寫(xiě)法跟我以前寫(xiě)的也不一樣呀!這么配置,我也不知道 Spring Security 中有哪些過(guò)濾器,其實(shí),換一個(gè)寫(xiě)法,我們就可以將這個(gè)配置成以前那種樣子:
@Configuration
public class SecurityConfig {
@Bean
UserDetailsService userDetailsService() {
InMemoryUserDetailsManager users = new InMemoryUserDetailsManager();
users.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin").build());
users.createUser(User.withUsername("江南一點(diǎn)雨").password("{noop}123").roles("admin").build());
return users;
}
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll()
.and()
.csrf().disable();
return http.build();
}
}
這么寫(xiě),就跟以前的寫(xiě)法其實(shí)沒(méi)啥大的差別了。
好啦,多余的廢話(huà)我就不多說(shuō)了,小伙伴們可以去試試 Spring Boot2.7 的最新玩法啦~
更多關(guān)于SpringBoot2.7類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 注冊(cè)中心配置了spring?security后客戶(hù)端啟動(dòng)報(bào)錯(cuò)
- SpringBoot?整合Security權(quán)限控制的初步配置
- Spring?Security自定義登錄頁(yè)面認(rèn)證過(guò)程常用配置
- Spring Security實(shí)現(xiàn)禁止用戶(hù)重復(fù)登陸的配置原理
- spring security動(dòng)態(tài)配置url權(quán)限的2種實(shí)現(xiàn)方法
- SpringBoot + Spring Security 基本使用及個(gè)性化登錄配置詳解
- Spring?Security?OAuth?Client配置加載源碼解析
相關(guān)文章
Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理操作
這篇文章主要介紹了Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
Java枚舉類(lèi)型在switch語(yǔ)句正確使用方法詳解
這篇文章主要介紹了Java枚舉類(lèi)型在switch語(yǔ)句正確使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Spring?Security實(shí)現(xiàn)統(tǒng)一登錄與權(quán)限控制的示例代碼
這篇文章主要介紹了Spring?Security實(shí)現(xiàn)統(tǒng)一登錄與權(quán)限控制,本文通過(guò)示例代碼重點(diǎn)看一下統(tǒng)一認(rèn)證中心和業(yè)務(wù)網(wǎng)關(guān)的建設(shè),需要的朋友可以參考下2022-03-03
SWT(JFace)體驗(yàn)之圖片的動(dòng)態(tài)漸變效果
SWT(JFace)體驗(yàn)之圖片的動(dòng)態(tài)漸變效果2009-06-06
Springboot實(shí)現(xiàn)通用Auth認(rèn)證的幾種方式
本文主要介紹了Springboot實(shí)現(xiàn)通用Auth認(rèn)證的幾種方式,主要介紹了4種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

