SpringSecurity 吐槽篇

Keep it simple, stupidhtml

配置複雜難以理解

以一段配置爲例

@Override
  public void configure(WebSecurity web) {
    web.ignoring()
      .antMatchers(HttpMethod.OPTIONS, "/**")
      .antMatchers("/app/**/*.{js,html}")
      .antMatchers("/i18n/**")
      .antMatchers("/swagger-ui/index.html")
      .antMatchers("/test/**");
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .exceptionHandling()
      .authenticationEntryPoint(http401UnauthorizedEntryPoint())
      .and()
      .csrf()
      .disable()
      .headers()
      .disable()
      .sessionManagement()
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
      .and()
      .authorizeRequests()
      .antMatchers("/auth/**").permitAll()
      .antMatchers("/actuator/**").access(actuatorExp)
      .antMatchers("/user/register/").hasAuthority(AuthoritiesConstants.API_REGISTER.getValue())
      .antMatchers("/**").hasAuthority(AuthoritiesConstants.USER.getValue())
      .antMatchers("/pick/**").hasAuthority(AuthoritiesConstants.PICKER.getValue())
      .and()
      .securityContext()
      .securityContextRepository(new NullSecurityContextRepository())
      .and()
      .apply(securityConfigurerAdapter());

    if (verificationSecurityConfigurer != null) {
      http.apply(verificationSecurityConfigurer);
    }
  }
複製代碼

WebSecurity 與 HttpSecurity 什麼關係, 能不能統一到一塊兒配置?java

HttpSeecurity 的配置從上到下沒有層次感, 須要瞭解足夠多的內部配置信息才能準確配置.web

"Explicit is better than implicit", Spring Security 默認啓用的配置10+, 都是隱式配置, 可是須要顯式的 disable .安全

優化用戶體驗?

下面也許更好session

http
      .apply(sessionConfigurer)
      .apply(csryConfigurer)
      .apply(contextConfigurer)
      .apply(authorizeConfigurer)
      .apply(customConfigurer)
複製代碼
  • 顯式配置, 提供默認配置的實現, 但不默認配置.
  • 具體配置由配置類實現, 不在頂層配置.

實現複雜

實現獲取 Token, 驗證, 受權, 訪問控制使用的都是 Filter. 並且 Filter 仍是 Servlet 規範的 Filter , 對使用者而言, 難免混淆.app

Filter 過於強大(強大到能夠基於 FIlter 實現 Struts2 框架 ), 而 Spring Security 並未對此設限.框架

以異常處理來作業務邏輯. 這個也是不得已爲之, 畢竟基於 Filteride

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
複製代碼

Filter 的核心方法 doFilter 是沒有返回值的 以異常處理作業務處理的問題, 就是重拾萬惡的GOTO 語句優化

END

固然, Spring Security 被普遍使用的緣由在於它確實能夠知足用戶的安全需求, 儘管並很差用. 有沒有更簡單的安全框架, 也許 Shiro 是個不錯的選擇, 但我的並無進一步瞭解, 此處不表.ui

因爲 Spring Security 是 Spring 官方默認實現, 在很長的一段時間內, 依然會是主流, 若是不能反抗, 那就享受吧.

相關文章
相關標籤/搜索