Spring Security和自定義filter的沖突導致多執行的解決方案

問題描述:

使用Spring Security時,在WebSecurityConfig中需要通過@bean註解註入Security的filter對象,但是不知是不是因為spring boot框架的原因還是什麼未知原因,導致在這裡註入,就會多註入一次這個對象,導致filter鏈走完之後,又會回到這個filter中再執行一次。

@Bean
    public JwtAuthenticationTokenFilter authenticationTokenFilterBean() throws Exception {
        return new JwtAuthenticationTokenFilter();
    }

這是WebSecurityConfig.java中原本需要註入的對象。

httpSecurity
.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);

添加到Security中,這時,可能就會因為這一次的註入,導致filter鏈在本應該執行完之後,再一次執行添加到Security的filter……

解決辦法:

將這兩個代碼段註釋掉即可解決,當然,隻是解決filter鏈執行完後再執行Security的filter的問題,本質上來說並不能真正的解決問題。如果有更好的理解或者更好的解決方法,歡迎討論。

2019-5-9 16:49:00:之前這麼做發現,這樣Spring Security就相當於沒有作用瞭,但是filter還是會起作用,而如果啟用Spring Security,還是會進入filter……如果授權自定義的話Spring Security感覺沒有用處瞭,當然這是我碰到的問題,框架也是別人搭起來的,但是用法是不對的,導致寫的filter變成瞭自定義的,感覺跟Spring Security框架格格不入,如果有大佬知道的話歡迎指導!謝謝。

如果要使用Spring Security,那麼就需要將JwtAuthenticationTokenFilter上的@Component註解刪除或者註釋掉,因為二次註入的類都是這個,但是產生的類對象應該是不一樣的,所以會導致二次進入filter。

所以搞得我現在很懷疑Spring Security是不是有必要……

Spring Security3自定義安全過濾器位置及註意事項

當auto-config=”true”時,springSecurity自動創建過濾器鏈

1.自定義過濾器位置需要在已有過濾器之前或之後,否則會報錯;

2.由於FilterSecurityInterceptor安全observeOncePerRequest(每個請求一次)默認為true.

默認情況下FilterSecurityInterceptor隻會執行一個,所以如果既要執行默認安全過濾器又要執行自定義過濾器,自定義過濾器放到默認安全過濾器之前,同時observeOncePerRequest設置為false.

如:

(1)

<custom-filter after="FILTER_SECURITY_INTERCEPTOR" ref="menuFilter" />

(2)

<beans:property name="observeOncePerRequest" value="false" />

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: