当前位置: 首页 > 面试题库 >

如何在Spring Security中从默认过滤器堆栈中删除一个过滤器?

司业
2023-03-14
问题内容

我必须从Spring
Security堆栈中排除一个默认过滤器。因此,所有过滤器都应照常工作。看来我找到了解决方法,请创建自定义FilterChainProxy:

public class CustomFilterChainProxy extends FilterChainProxy {

Logger LOGGER = Logger.getLogger(CustomFilterChainProxy.class);

public CustomFilterChainProxy() {
    super();
    LOGGER.debug("Run custom filter proxy");
    LOGGER.debug("String filters: " + this.toString());
}

public CustomFilterChainProxy(SecurityFilterChain chain) {
    super(chain);
    LOGGER.debug("Run custom filter proxy with chains");
}
}

如您所见,它具有获取过滤器列表的构造函数,因此我将能够根据需要从链中删除一个过滤器,其余所有过滤器将照常工作。但是我不能在这样的构造函数的安全配置中制作bean。如果我用

<bean id="filterChainProxy" class="com.pkg.CustomFilterChainProxy">

当然,使用默认构造函数构建对象。好的,我尝试用一​​些过滤器列表制作bean:

<bean id="filterChainProxy" class="ru.olekstra.backoffice.util.CustomFilterChainProxy">
<constructor-arg>
    <list>
        <sec:filter-chain pattern="/**" 
        filters="BasicUserApprovalFilter" />
    </list>
</constructor-arg>
</bean>

但这不会编译,导致BasicUserApprovalFilter是未知的bean。那么如何从默认过滤器堆栈中排除一个过滤器呢?如果我使用自定义过滤器链代理的方法是一个好的决定,那么如何使用默认过滤器链创建bean?


问题答案:

如果您提供了有关要删除的过滤器及其原因的更多详细信息,可能会有所帮助。

如果需要,可以BeanPostProcessor在创建过滤器链后使用a对其进行修改。在默认的名称空间配置中,可以给<http>元素创建的过滤器链命名:

<http name="myFilterChain">
   ...

这将SecurityFilterChain使用该名称注册类型的Bean 。将FilterChainProxy可以从这些列表创建的。

后处理器看起来像:

public class SecurityFilterChainPostProcessor implements BeanPostProcessor {

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        if (beanName.equals("myFilterChain")) {
            DefaultSecurityFilterChain fc = (DefaultSecurityFilterChain)bean;
            List<Filter> filters = fc.getFilters();

            // Modify the filter list as you choose here.                
            List<Filter> newFilters = ...

            return new DefaultSecurityFilterChain(fc.getRequestMatcher(), newFilters);
        }

        return bean;
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

然后只需在您的应用程序上下文中注册此bean的一个实例,其余的工作将由Spring完成。这样,您可以避免将所有Spring
Security基础结构过滤器定义为单独的bean。

更新资料

这里是一个链接真实世界的例子和它的配置。



 类似资料:
  • 问题内容: 我有一个过滤器linkifyStuff,其中需要使用其他过滤器处理一些变量。我无法弄清楚从另一个调用一个过滤器的语法。 我了解过滤器链接-这不是我想要的。我想将过滤器应用于linkifyStuff过滤器中的局部变量,而不是其输入或输出。 我希望像下面这样工作,但是$ filter(’filtername’)显然不是正确的语法。 我可以为sanitizeStuff和sanitizeStu

  • 问题内容: 如何从“全部”更改默认过滤器选择?我有一个名为领域它有三个值:和。当我在Django admin中使用时,默认情况下将过滤器设置为“全部”,但默认情况下我想将其设置为待处理。 问题答案:

  • 问题内容: 我只想在Flask-Admin模型列表视图中显示已付款的订单。 这是models.py: 这是Flask-Admin的ModelView: 过滤器工作正常,但我想将此过滤器设为默认值。更好的是,不要使用过滤器,而只显示查询输出的顺序。 Flask-Admin是否可以使用? 问题答案: 我们通过覆盖ModelView在我们的应用程序中执行此操作。 https://github.com/m

  • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在

  • 正如您所看到的,它有一个构造函数,它可以得到过滤器列表,所以我可以根据需要从链中删除一个过滤器,其余的都可以正常工作。但是我不能为这样的构造函数在安全配置中创建bean。如果我使用 当然,它使用默认构造函数构建对象。好的,我试着用一些过滤器的列表来制作bean: 但这无法编译,因为BasicUserApprovalFilter是未知bean。那么如何从默认筛选器堆栈中排除一个筛选器呢?如果我用自定

  • 参见文档“10. Web”部分