一、permitAll方法
在Spring Security中,permitAll方法用於開放某些URL的訪問權限,即使沒有通過身份驗證也可以進行訪問。該方法在處理Spring Security的訪問控制時非常常見,使用方式如下:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/hello").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").defaultSuccessUrl("/home").permitAll()
.and()
.logout().permitAll();
}
}
上面的示例代碼中,我們配置了「/hello」路徑為不需要身份認證的路徑,即使用戶沒有登錄也可以進行訪問。
二、permitAll方法原理
在上一個小節中,我們已經了解了permitAll方法的使用方法,那麼這個方法背後的原理是什麼呢?
在Spring Security中,訪問控制之所以能夠生效,是因為它將SecurityFilterChain對象添加到過濾器鏈中。在處理請求時,這個過濾器鏈將會按照順序執行一系列的過濾器,其中就包括了一個AnonymousAuthenticationFilter過濾器。
這個過濾器將在匿名用戶訪問時,自動為其創建一個AnonymousAuthenticationToken,這個Token將代表一個未認證的用戶,而permitAll方法的作用就是使這個Token獲得訪問控制內的訪問授權。
三、permitAll不生效
在實際開發工作中,我們可能會遇到這樣的情況——無論如何configure(HttpSecurity http)方法都無法禁用身份驗證,即使在特定的URL上使用了permitAll方法。
這個問題的原因是因為在配置的時候,我們的HttpSecurity對象可能設置了多個SecurityFilterChain,導致permitAll方法可能被其他SecurityFilterChain覆蓋。
解決這個問題的方法是,在configure(HttpSecurity http)方法中為每個SecurityFilterChain都設置permitAll方法,確保所有的SecurityFilterChain都生效。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationEntryPoint unauthorizedHandler;
@Autowired
private JwtTokenProvider jwtTokenProvider;
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter(jwtTokenProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
@Configuration
@Order(1)
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS).permitAll()
.anyRequest().authenticated();
}
}
@Configuration
@Order(2)
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login**", "/signup**", "/h2-console/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.failureUrl("/login?error=true")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login")
.permitAll()
.and().csrf().disable();
http.headers().frameOptions().disable();
}
}
}
四、permit和allow的區別
在Spring Security中,除了permitAll方法外,還有allowAll方法,那麼這兩者之間到底有什麼區別呢?
實際上,這兩者之間的區別非常微妙,相信大部分開發者都無法分辨它們之間的差異。其實,在Spring Security中,permitAll就是allowAll的別名,這兩個方法完全等價。
五、permitAll和anonymous的區別
在Spring Security中,permitAll和anonymous都可以用來授權未認證的用戶,那麼這兩者之間有何區別呢?
簡而言之,permitAll是用於授權未認證用戶對系統內的URL資源進行訪問,而anonymous則是用於允許非匿名用戶訪問系統中的受保護資源。
在實際應用中,permitAll通常被用來允許未認證的用戶訪問一些公開資源,比如首頁、註冊頁面等。而anonymous則被用來授權已經被認證的用戶在系統內匿名訪問一些資源,比如用戶名片。
總結
本文詳細介紹了Spring Security中permitAll方法的使用方法和原理,並且討論了permitAll不生效、permit和allow的區別以及permitAll和anonymous的區別等相關問題。通過本文的閱讀,相信讀者們已經掌握了permitAll在不同場景下的使用方式和注意事項,並且可以在實際開發中熟練運用這個強大的功能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/150856.html
微信掃一掃
支付寶掃一掃