首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在运行时修改Spring Security过滤器链?

在运行时修改Spring Security过滤器链可以通过以下步骤实现:

  1. 创建一个自定义的过滤器链类,继承自AbstractSecurityInterceptor,并实现FilterInvocationSecurityMetadataSource接口和AccessDecisionManager接口。这个类将负责动态管理过滤器链。
  2. 在自定义的过滤器链类中,重写getFilters方法,根据需要动态添加、删除或修改过滤器。可以使用FilterChainProxy类的getFilterChains方法获取当前的过滤器链。
  3. 在Spring Security的配置类中,使用http.addFilterBeforehttp.addFilterAfterhttp.addFilterAt方法将自定义的过滤器链类添加到过滤器链中的指定位置。
  4. 在运行时,通过调用自定义的过滤器链类的方法,根据需求动态修改过滤器链。例如,可以根据用户角色或权限动态添加或删除某些过滤器。

以下是一个示例代码:

代码语言:txt
复制
public class CustomFilterChain extends AbstractSecurityInterceptor implements FilterInvocationSecurityMetadataSource {

    private FilterInvocationSecurityMetadataSource securityMetadataSource;
    private AccessDecisionManager accessDecisionManager;

    public CustomFilterChain(FilterInvocationSecurityMetadataSource securityMetadataSource, AccessDecisionManager accessDecisionManager) {
        this.securityMetadataSource = securityMetadataSource;
        this.accessDecisionManager = accessDecisionManager;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        FilterInvocation fi = new FilterInvocation(request, response, chain);
        invoke(fi);
    }

    public void invoke(FilterInvocation fi) throws IOException, ServletException {
        // 进行权限验证等操作
        InterceptorStatusToken token = super.beforeInvocation(fi);
        try {
            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
        } finally {
            super.afterInvocation(token, null);
        }
    }

    @Override
    public void destroy() {
        // 销毁操作
    }

    @Override
    public Class<?> getSecureObjectClass() {
        return FilterInvocation.class;
    }

    @Override
    public SecurityMetadataSource obtainSecurityMetadataSource() {
        return this.securityMetadataSource;
    }

    @Override
    public void setAccessDecisionManager(AccessDecisionManager accessDecisionManager) {
        this.accessDecisionManager = accessDecisionManager;
    }

    @Override
    public AccessDecisionManager getAccessDecisionManager() {
        return this.accessDecisionManager;
    }
}

在Spring Security的配置类中,可以这样使用自定义的过滤器链类:

代码语言:txt
复制
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomFilterChain customFilterChain;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .addFilterBefore(customFilterChain, FilterSecurityInterceptor.class);
    }
}

这样,就可以在运行时修改Spring Security过滤器链了。根据具体需求,可以在自定义的过滤器链类中实现动态添加、删除或修改过滤器的逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Security过滤器体系

在学习Spring Security的时候你有没有下面这两个疑问: Spring Security的登录是怎么配置的? Spring Security的访问控制是什么机制?...interface SecurityFilterChain { // 当前请求是否匹配 boolean matches(HttpServletRequest request); // 一揽子过滤器组成的有序过滤器...不管用户是哪种角色,都走的是一个过滤器,一个应用中存在1-n个SecurityFilterChain。那谁来管理多个SecurityFilterChain呢?...❝请注意:在同一过滤器中不建议有多个FilterChainProxy实例,而且不应将其作为单纯的过滤器使用,它只应该承担管理SecurityFilterChain的功能。...而DelegatingFilterProxy作为Spring IoC和Servlet的连接器存在。 简单总结 上面的三个概念非常重要,涉及到Spring Security的整个过滤器体系。

61050

Spring Security过滤器机制

活动地址:CSDN21天学习挑战赛 相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现...GitHub快捷登录 前言 在“码农小胖哥”的文章中提到一个关键的过滤器SecurityFilterChain,当一个请求 HttpServletRequest 进入 SecurityFilterChain...时,会通过 matches 方法来确定是否满足条件进入过滤器,进而决定请求应该执行哪些过滤器。...Servlet Filter代理,在xml的Spring时代,为了能使用Spring Security,需要在web.xml中添加该过滤器,而在Spring Boot中,Spring Boot的自动配置已经帮我们搞定...,内部保存了过滤器列表,而过滤器内部又具有各种过滤器,如图3。

87930
  • Spring Security 6.x 过滤器SecurityFilterChain是如何工作的

    上一篇主要介绍了Spring Secuirty中的过滤器SecurityFilterChain是如何配置的,那么在配置完成之后,SecurityFilterChain是如何在应用程序中调用各个Filter...一、Filter背景知识因为Spring Security底层依赖Servlet的过滤器技术,所以先简单地回顾一下相关背景知识。...,它组成了真正的“过滤器”,下面是FilterChain的实现类ApplicationFilterChain的部分源码:当请求到达Servlet容器时,就会创建出一个FilterChain实例,然后调用...我们一层一层逐步说明这个问题:首先要解决的是如何在Filter中获取Spring容器中Bean对象,因为在Servlet容器中启动时,各个Filter的实例便会初始化并完成注册,此时Spring Bean...SecurityFilterChain,都不会引起Servlet FilterChain的变更,这样的设计很好地遵循了开放封闭原则,即对Servlet Filter的修改是保持封闭的,而对Spring

    35520

    Spring Security 竟然可以同时存在多个过滤器

    这就涉及到 Spring Security过滤器的配置问题了,本文松哥就来和大家稍微聊一聊。...1.从过滤器开始 即使大家没有仔细研究过 Spring Security 中认证、授权功能的实现机制,大概也都多多少少听说过 Spring Security 这些功能是通过过滤器来实现的。...2.多个过滤器 上面和大家介绍的是单个过滤器,实际上,在 Spring Security 中,可能存在多个过滤器。...我们在该方法中的配置,都是在添加/移除/修改 Spring Security 默认提供的过滤器,所以该方法就是在配置 Spring Security 中的过滤器,至于是怎么配置的,松哥以后抽时间再来和大家细说...4.小结 好啦,今天就和小伙伴们简单分享一下 Spring Security过滤器的问题,后面松哥再抽时间和大家聊一聊过滤器中每一个过滤器的配置以及含义~

    1.5K20

    Spring Security 实战干货:过滤器的机制和特性

    前言 过滤器作为 Spring Security 的重中之重,我们需要了解其中的机制。这样我们才能根据业务需求的变化进行定制。今天来探讨一下 Spring Security 中的过滤器机制。...Spring Security 过滤器 客户端(APP 和后台管理客户端)向应用程序发送请求,然后应用根据请求的 URI 的路径来确定该请求的过滤器(Filter)以及最终的具体 Servlet 控制器...从上图我们可以看出 Spring Security 以一个单 Filter(FilterChainProxy) 存在于整个过滤器中,而这个 FilterChainProxy 实际内部代理着众多的 Spring...” Spring Security 允许有多 条过滤器并行,Spring Security 的 FilterChainProxy 可以代理多条过滤器并根据不同的 URI 匹配策略进行分发。...总结 今天我们通过对 Spring Security过滤器机制,对于深入学习 Spring Security 有着至关重要的意义。有什么问题和心得请留言反馈。

    45210

    《设计模式》总结和在spring框架的实践

    一些地方描述可能有误,在往后的更多实践经验来进一步的修改。...即使我们构建完应用程序后,如果需要重构,设计模式仍可以教你如何修改系统。设计模式是重构必经之路,但不是最终的目标。...让我们看看一些 Spring 实现此模式的功能: 织入通知到 Spring 应用程序中。它使用装饰者模式的 CGLib 代理,其通过在运行时生成目标类的子类来工作。...在 Spring 中,其他模块也实现了代理模式,如 RMI、 Spring 的 HTTP 调用、Hessian 和 Burlap。 责任模式 Spring Security 项目实现了责任模式。...Spring Security 允许通过使用安全过滤器在应用程序中实现身份验证和授权功能。这是一个高度可配置的框架。由于使用了责任设计模式,我们可以在过滤器上添加自定义过滤器以自定义功能。

    43710

    Spring认证-Spring 安全架构专题教程

    事实上,如果过滤器想要自己处理请求,它可以否决的其余部分。过滤器还可以修改下游过滤器和 servlet 中使用的请求或响应。...Boot 应用程序在包装请求、修改其行为时希望过滤器具有的最大顺序)锚定。...可以有多个过滤器,所有过滤器都由同一顶层的 Spring Security 管理,FilterChainProxy并且容器都不知道所有过滤器。...Spring Security 过滤器包含一个过滤器列表,并将请求分派到匹配它的第一个。下图显示了基于匹配请求路径(/foo/**匹配之前/**)发生的调度。....;   } } 这个 bean 导致 Spring Security 添加一个新的过滤器并在回退之前对其进行排序。 与另一组资源相比,许多应用程序对一组资源具有完全不同的访问规则。

    71920

    Spring」认证安全架构指南

    事实上,如果过滤器想要自己处理请求,它可以否决的其余部分。过滤器还可以修改下游过滤器和 servlet 中使用的请求或响应。...Boot 应用程序在包装请求时期望过滤器具有的最大顺序,修改其行为)。...Spring Security 是单一物理的Filter,但将处理委托给内部过滤器实际上,安全过滤器中甚至还有一层间接性:它通常以 ....可以有多个过滤器都由 Spring Security 在同一顶层管理,FilterChainProxy并且对容器都是未知的。...Spring Security 过滤器包含一个过滤器列表,并将请求分派到与其匹配的第一个。下图显示了基于匹配请求路径(/foo/**匹配之前/**)发生的调度。这很常见,但不是匹配请求的唯一方法。

    96330

    Spring Security 的 Filter 和 Filter 顺序(一)

    Spring Security是一个强大的安全框架,提供了许多功能和组件来保护Web应用程序。其中一个重要的组件是过滤器(Filter Chain)。...在本文中,我们将探讨Spring Security过滤器过滤器顺序,以及如何配置和定制过滤器。...Spring Security过滤器Spring Security中,过滤器是一系列安全过滤器的集合,它们按顺序处理每个传入请求,并根据配置确定请求是否允许访问。...过滤器通常在Spring Security的Web安全配置中进行定义。...这些过滤器都是可配置的,并且可以根据应用程序的需要进行添加、删除或修改。默认情况下,Spring Security配置的过滤器按照上述顺序执行,但也可以通过配置来修改过滤器的执行顺序。

    1K20

    Spring Security 实战干货:图解Spring Security过滤器体系

    前言 我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行罗列,但是Spring Security真正的过滤器体系才是我们了解它是如何进行...servlet过滤器 Filter不但可以修改HttpServletRequest和HttpServletResponse,可以让我们在请求响应的前后做一些事情,甚至可以终止过滤器FilterChain...Spring Security正是根据这个个特性来实现一系列的安全功能。接下来我们来看看它们是如何结合的。 3....Spring Security提供了一个SecurityFilterChain接口来满足被匹配HttpServletRequest走特定的过滤器的需求。...总结 结合上面,最终上述这些概念的关系彻底搞清楚了,搞清楚过滤器的运作模式对于学习和使用Spring Security至关重要。 ? Spring Security Servlet过滤器组织关系

    3.7K21

    漫谈设计模式在 Spring 框架中的良好实践

    那么,本文的核心话题是 Spring 如何通过使用大量设计模式和良好实践来构建应用程序。...让我们看看一些 Spring 实现此模式的功能: 织入通知到 Spring 应用程序中。它使用装饰者模式的 CGLib 代理,其通过在运行时生成目标类的子类来工作。...在 Spring 中,其他模块也实现了代理模式,如 RMI、 Spring 的 HTTP 调用、Hessian 和 Burlap。 责任模式 Spring Security 项目实现了责任模式。...Spring Security 允许通过使用安全过滤器在应用程序中实现身份验证和授权功能。这是一个高度可配置的框架。由于使用了责任设计模式,我们可以在过滤器上添加自定义过滤器以自定义功能。...文末思考 你已经知道 GOF 设计模式在 Spring 框架中的常见实现,那么可以说一下 Spring 框架是如何实现单例模式的呢?

    1.2K30

    漫谈设计模式在 Spring 框架中的良好实践

    假设我是面试官问起了你这些面试题,你该如何回答呢,请先思考一分钟。...那么,本文的核心话题是 Spring 如何通过使用大量设计模式和良好实践来构建应用程序。...让我们看看一些 Spring 实现此模式的功能: 织入通知到 Spring 应用程序中。它使用装饰者模式的 CGLib 代理,其通过在运行时生成目标类的子类来工作。...在 Spring 中,其他模块也实现了代理模式,如 RMI、 Spring 的 HTTP 调用、Hessian 和 Burlap。 责任模式 Spring Security 项目实现了责任模式。...Spring Security 允许通过使用安全过滤器在应用程序中实现身份验证和授权功能。这是一个高度可配置的框架。由于使用了责任设计模式,我们可以在过滤器上添加自定义过滤器以自定义功能。

    61810

    Spring Security 两种资源放行策略,千万别用错了!

    Security 过滤器,而第二种方式走 Spring Security 过滤器,在过滤器中,给请求放行。...接下来我以登录接口为例,来和小伙伴们分析一下走 Spring Security 过滤器有什么不同。...具体的操作办法,大家可以看看松哥之前发布的教程:Spring Security 如何动态更新已登录用户信息?。...中,进而导致后来的请求都无法获取到登录用户信息(后来的请求在系统眼里也都是未认证的请求) 如果你的登录请求正常,走了 Spring Security 过滤器,但是后来的 A 请求没走过滤器(采用前面提到的第一种方式放行...3.小结 总之,前端静态资源放行时,可以直接不走 Spring Security 过滤器,像下面这样: @Override public void configure(WebSecurity web)

    2.2K50

    如何利用自定义注解放行SpringSecurity项目的接口

    但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优雅。 例如这样: 所以想通过自定义一个注解,来进行接口匿名访问。...Security 过滤器,而第二种方式走 Spring Security 过滤器,在过滤器中,给请求放行。...大家知道,登录接口也是必须要暴露出来的,不需要登录就能访问到的,但是我们却不能将登录接口用第一种方式暴露出来,登录请求必须要走 Spring Security 过滤器,因为在这个过程中,还有其他事情要做...Security 过滤器, * 无法通过 SecurityContextHolder 获取到登录用户信息的, * 因为它一开始没经过 SecurityContextPersistenceFilter...过滤器

    1.1K20

    设计模式之责任模式及典型应用

    ,可简化对象的相互连接 在给对象分派职责时,职责可以给我们更多的灵活性,可以在运行时对该进行动态的增删改,改变处理一个请求的职责 新增一个新的具体请求处理者时无须修改原有代码,只需要在客户端重新建即可...,造成循环调用,导致系统陷入死循环 适用场景 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到上,而无须关心请求的处理对象是谁以及它是如何处理的 在不明确指定接收者的情况下...为 StandardWrapperValve,其中的一个作用是调用 ApplicationFilterFactory 生成 Filter,具体代码在 invoke 方法中 在运过滤器之前需要完成过滤器的加载和初始化...FilterChain 的实现类 这里列举几个典型应用: Netty 中的 Pipeline 和 ChannelHandler 通过责任设计模式来组织代码逻辑 Spring Security 使用责任模式...,可以动态地添加或删除责任(处理 request 请求) Spring AOP 通过责任模式来管理 Advisor Dubbo Filter 过滤器也是用了责任模式(链表),可以对方法调用做一些过滤处理

    5.1K62
    领券