天天看點

Spring Security 授權認證部分學習記錄Spring Security官方文檔

Spring Security官方文檔

 Spring Security和Shiro都是安全架構,其中包含了很多内容本文主要記錄一下自己了解的授權認證部分希望能表達的盡量簡潔和完整,歡迎交流。

 formlogin主體流程

Spring Security 授權認證部分學習記錄Spring Security官方文檔

其中認證相關Filter負責建構Token實體(未認證),并交給AuthenticationProvider進行驗證Token并重新建構Token實體(已認證)。具體可參見org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter内源碼。

還包含其它認證流程如BasicAuthenticationFilter,DigestAuthenticationFilter等,官方給的formlogin就是UsernamePasswordAuthenticationFilter相關的一整套流程,有興趣的話可以看下formlogin這個方法對應的源碼,其中包含了很多内容這裡主要記錄的是認證授權。

配置說明

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 /**
  * 配置認證相關資訊自定義AuthenticationProvider,UserDetailsService等
  * @param auth
  * @return void
  * @author mjm
  * @date 2020/1/20 16:08
  */

 @Override
 protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  super.configure(auth);
 }

 /**
  * 整體設定,異常處理,需忽略的url等
  * @param web
  * @return void
  * @author mjm
  * @date 2019/12/30 14:07
  */
 @Override
 public void configure(WebSecurity web) {
  web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**")
    .antMatchers("/css/**", "/fonts/**",
      "/img/**", "/js/**", "/plugins/**");
 }
 /**
  * 請求過程相關配置,formlogin,權限驗證,cors,自定義過濾器等
  * @author mjm
  * @date 2020/1/20 16:13
 * @param http
  * @return void
  */
 @Override
 protected void configure(HttpSecurity http) throws Exception {
  http.cors().disable().csrf().disable().headers().frameOptions().disable();
  http.formLogin();
  http.authorizeRequests().antMatchers("/**").access("@sysAuthorize.check(authentication,request)");
 }
}           

HttpSecurity說明:

1. 比對url的順序是從上至下

  1. access是自定義權健部分具體可參見官網中"Referring to Beans in Web Security Expressions"這一段,其中能傳遞的參數隻有authentication(認證資訊),request
  2. 自定義過濾器通過http.addFilterXXXX來添加可以指定過濾器的順序
  3. 配置了formlogin SpringSecurity會通過預設配置實作一整套的認證流程,包含頁面,但需要實作UserDetailsService
這裡列舉的是我認為比較重要的三個配置,WebSecurityConfigurerAdapter中包含很多其他的配置具體具體可參見源碼

其它

1.自定義認證過程如何處理

繼承AbstractAuthenticationProcessingFilter

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
    //   token = xxx  
    return this.getAuthenticationManager().authenticate(token);
}