您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“SpringBoot2.7 WebSecurityConfigurerAdapter類過期如何配置”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“SpringBoot2.7 WebSecurityConfigurerAdapter類過期如何配置”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
進(jìn)入到 SpringBoot2.7 時代,有小伙伴發(fā)現(xiàn)有一個常用的類忽然過期了:
在 Spring Security 時代,這個類可太重要了。過期的類當(dāng)然可以繼續(xù)使用,但是你要是決定別扭,只需要稍微看一下注釋,基本上就明白該怎么玩了。
我們來看下 WebSecurityConfigurerAdapter 的注釋:
從這段注釋中我們大概就明白了咋回事了。
以前我們自定義類繼承自 WebSecurityConfigurerAdapter 來配置我們的 Spring Security,我們主要是配置兩個東西:
configure(HttpSecurity)
configure(WebSecurity)
前者主要是配置 Spring Security 中的過濾器鏈,后者則主要是配置一些路徑放行規(guī)則。
現(xiàn)在在 WebSecurityConfigurerAdapter 的注釋中,人家已經(jīng)把意思說的很明白了:
以后如果想要配置過濾器鏈,可以通過自定義 SecurityFilterChain Bean 來實現(xiàn)。
以后如果想要配置 WebSecurity,可以通過 WebSecurityCustomizer Bean 來實現(xiàn)。
那么接下來我們就通過一個簡單的例子來看下。
首先我們新建一個 Spring Boot 工程,引入 Web 和 Spring Security 依賴,注意 Spring Boot 選擇最新的 2.7。
接下來我們提供一個簡單的測試接口,如下:
@RestController public class HelloController { @GetMapping("/hello") public String hello() { return "hello 江南一點雨!"; } }
小伙伴們知道,在 Spring Security 中,默認(rèn)情況下,只要添加了依賴,我們項目的所有接口就已經(jīng)被統(tǒng)統(tǒng)保護(hù)起來了,現(xiàn)在啟動項目,訪問 /hello
接口,就需要登錄之后才可以訪問,登錄的用戶名是 user,密碼則是隨機生成的,在項目的啟動日志中。
現(xiàn)在我們的第一個需求是使用自定義的用戶,而不是系統(tǒng)默認(rèn)提供的,這個簡單,我們只需要向 Spring 容器中注冊一個 UserDetailsService 的實例即可,像下面這樣:
@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("江南一點雨").password("{noop}123").roles("admin").build()); return users; } }
這就可以了。
當(dāng)然我現(xiàn)在的用戶是存在內(nèi)存中的,如果你的用戶是存在數(shù)據(jù)庫中,那么只需要提供 UserDetailsService 接口的實現(xiàn)類并注入 Spring 容器即可,這個之前在 vhr 視頻中講過多次了(公號后臺回復(fù) 666 有視頻介紹),這里就不再贅述了。
但是假如說我希望 /hello
這個接口能夠匿名訪問,并且我希望這個匿名訪問還不經(jīng)過 Spring Security 過濾器鏈,要是在以前,我們可以重寫 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("江南一點雨").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 中,該配置的東西寫在這里就可以了。
那如果我還希望對登錄頁面,參數(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("江南一點雨").password("{noop}123").roles("admin").build()); return users; } @Bean SecurityFilterChain securityFilterChain() { List<Filter> filters = new ArrayList<>(); return new DefaultSecurityFilterChain(new AntPathRequestMatcher("/**"), filters); } }
Spring Security 的底層實際上就是一堆過濾器,所以我們之前在 configure(HttpSecurity) 方法中的配置,實際上就是配置過濾器鏈。現(xiàn)在過濾器鏈的配置,我們通過提供一個 SecurityFilterChain Bean 來配置過濾器鏈,SecurityFilterChain 是一個接口,這個接口只有一個實現(xiàn)類 DefaultSecurityFilterChain,構(gòu)建 DefaultSecurityFilterChain 的第一個參數(shù)是攔截規(guī)則,也就是哪些路徑需要攔截,第二個參數(shù)則是過濾器鏈,這里我給了一個空集合,也就是我們的 Spring Security 會攔截下所有的請求,然后在一個空集合中走一圈就結(jié)束了,相當(dāng)于不攔截任何請求。
此時重啟項目,你會發(fā)現(xiàn) /hello
也是可以直接訪問的,就是因為這個路徑不經(jīng)過任何過濾器。
其實我覺得目前這中新寫法比以前老的寫法更直觀,更容易讓大家理解到 Spring Security 底層的過濾器鏈工作機制。
有小伙伴會說,這寫法跟我以前寫的也不一樣呀!這么配置,我也不知道 Spring Security 中有哪些過濾器,其實,換一個寫法,我們就可以將這個配置成以前那種樣子:
@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("江南一點雨").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(); } }
讀到這里,這篇“SpringBoot2.7 WebSecurityConfigurerAdapter類過期如何配置”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。