欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Security和自定义filter的冲突导致多执行的解决方案

程序员文章站 2022-07-05 19:24:28
问题描述:使用spring security时,在websecurityconfig中需要通过@bean注解注入security的filter对象,但是不知是不是因为spring boot框架的原因还...

问题描述:

使用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" />

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。