一、HttpSecurity源碼
HttpSecurity類是Spring Security核心配置類之一,用來配置Spring Security的行為,包括認證方式、權限控制、CSRF保護等。我們先來看一下HttpSecurity類的源碼結構:
@Configuration
public final class HttpSecurity extends
AbstractConfiguredSecurityBuilder
implements SecurityBuilder, SecurityConfigurerAware, HttpSecurity>, HttpSecurityBuilder {
// 構造方法
public HttpSecurity(ObjectPostProcessor
如上代碼所示,HttpSecurity是一個@Configuration配置類,繼承了AbstractConfiguredSecurityBuilder類,并實現了SecurityBuilder和SecurityConfigurerAware接口。其中,requestMatcher方法用于匹配請求的URL,根據匹配結果來對請求進行處理。
二、HttpSecurity的用法
使用方法可以分為以下幾步:
1、創建一個SecurityConfigurer,并在其中重寫configure方法,實現對HttpSecurity的配置;
2、通過調用HttpSecurity的apply方法,并傳入第一步創建的SecurityConfigurer,來將SecurityConfigurer中的配置應用到HttpSecurity中;
3、配置成功后,HttpSecurity會返回一個DefaultSecurityFilterChain類型的對象,用于構建安全過濾器鏈。
三、HttpSecurity配置
3.1 HttpSecurity默認配置
當我們沒有對HttpSecurity進行額外的配置時,Spring Security會使用默認配置。默認配置包括以下內容:
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
以上代碼表示,所有請求需要進行身份驗證,并且要求用戶使用表單登錄或HTTP基本認證。
3.2 HttpSecurity權限配置詳解
針對不同路徑和請求類型,我們可以配置不同的授權策略。
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
以上代碼表示,對于"/admin/**"路徑下的請求,需要有"ADMIN"角色方可訪問;對于"/db/**"路徑下的請求,需要有"ADMIN"和"DBA"兩個角色方可訪問;而其他請求只需要在通過身份驗證后即可訪問。同時,我們還可以設置登錄頁和退出頁。
3.3 HttpSecurity解密失敗怎么回事
解密失敗可能是因為客戶端傳遞的數據被篡改或者密鑰不正確,當出現解密失敗的情況,可以使用以下代碼對HttpSecurity進行配置:
http.exceptionHandling()
.authenticationEntryPoint(new Http403ForbiddenEntryPoint())
.accessDeniedHandler(new AccessDeniedHandlerImpl());
以上代碼為設置Http403ForbiddenEntryPoint和AccessDeniedHandlerImpl類,用于處理解密失敗后的異常情況。
四、完整代碼示例
下面是一個完整的HttpSecurity配置示例:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll()
.and()
.exceptionHandling()
.authenticationEntryPoint(new Http403ForbiddenEntryPoint())
.accessDeniedHandler(new AccessDeniedHandlerImpl());
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
以上代碼為一個完整的Spring Security配置類示例,其中包含了對HttpSecurity和AuthenticationManagerBuilder的配置。