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' />
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。
相關文章: