当前位置: 首页 > 知识库问答 >
问题:

在Servlet 3环境中添加要在spring security filter之后调用的自定义筛选器

李昌勋
2023-03-14

我使用的是Spring Security 3.2.4和Spring Boot 1.1.0(及其相关依赖项版本4.X)。我正在编写一个将在嵌入式tomcat中运行的web应用程序。

我试图添加两个额外的过滤器(与Spring Security性无关),其中一个将在Spring-Security-FilterChainProxy之前调用,另一个将在Spring-Security-FilterChainProxy之后调用。

我的Spring Security配置文件:

@Configuration
@EnableWebMvcSecurity
public class SecurityCtxConfig extends WebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
    .inMemoryAuthentication()
        .withUser("user").password("pass").roles("USER");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf()
            .disable()
            .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
            .formLogin()
            .usernameParameter("user").passwordParameter("password");
}
}

主类(Application.class):

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Bean
RequestFilter beforeSpringSecurityFilter(){
    return new RequestFilter();
}

@Bean
RequestFilter afterSpringSecurityFilter(){
    return new RequestFilter();
}

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

以及过滤器实现:

public class RequestFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
        FilterChain filterChain) throws ServletException, IOException {
        filterChain.doFilter(request, response);
}

}

在考虑FilterChainProxy(由WebSecurityConfigureAdapter创建)时,是否有方法控制调用顺序?要知道,所需的顺序是:

  1. 请求-过滤器-1

谢啦

共有3个答案

曹泉
2023-03-14

在某种程度上,spring boot将安全过滤器作为属性公开。这现在很容易做到。

在您的应用程序中。yml:

  spring:
    security:
      filter:
        order: 20

在Spring Security完成后,您要调用的一些过滤器:

@Bean
public FilterRegistrationBean<Filter> afterAuthFilterRegistrationBean() {
    FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
    //a filter that extends OncePerRequestFilter
    AfterAuthFilter afterAuthFilter = new AfterAuthFilter();
    registrationBean.setFilter(afterAuthFilter);
    //this needs to be a number greater than than spring.security.filter.order
    registrationBean.setOrder(30);
    return registrationBean;
}

对于在Spring security之前执行的筛选器,请将顺序设置为小于20的数字。

轩辕阳焱
2023-03-14

Spring Security使用的FilterChainProxy不是Orded(如果是,您可以订购所有过滤器)。但是您应该能够将其注册在FilterRegstrationBean中,即Orded并以相同的方式注册其他过滤器。对于安全过滤器,您可以按名称将其注入注册bean。您可能可以通过调用@Bean方法注入其他过滤器。

东门翰
2023-03-14

同意Dave Syer所说的一切;)但希望添加一个使用FilterRegistrationBean的Java配置示例。

在我的情况下,我发现我的自定义安全过滤器(使用Spring Security)为每个请求触发了两次。添加FilterRegstrationBean配置修复了这个问题。

    @Bean(name = "myFilter")
    public MyAuthenticationFilter myAuthenticationFilter(final MyAuthenticationEntryPoint entryPoint) {
        final MyAuthenticationFilter filter = new MyAuthenticationFilter();
        filter.setEntryPoint(entryPoint);
        return filter;
    }

    /**
     *  We do this to ensure our Filter is only loaded once into Application Context
     *
     */
    @Bean(name = "authenticationFilterRegistration")
    public FilterRegistrationBean myAuthenticationFilterRegistration(final MyAuthenticationFilter filter) {
        final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(filter);
        filterRegistrationBean.setEnabled(false);
        return filterRegistrationBean;
    }

(关于我在应用程序上下文中两次注册过滤器的具体问题,我发现重新实现MyAuthenticationFilter是从OncePerRequestFilter继承而来的,而不是使用FilterRegistrationBean。然而,OncePerRequestFilter的支持来自Servlet 3.x以上d因为我正在编写一个公共库,所以支持Servlet 2。可能需要x)

 类似资料:
  • 我正在尝试将基于Spring MVC xml的项目配置重构为基于Spring Boot java的配置。同时按如下方式设置shiro配置:

  • 我想添加用户的ID作为自定义声明到我的令牌。 但我无法在过滤器中获取用户id,因为依赖注入在过滤器中不起作用。我尝试使用UserService的构造函数,但在这个服务中,我有一个存储库,它是im@Autowiring,所以在调试模式下,我看到userRepository字段为空。 我的问题是我将如何添加这个自定义声明?也许这是添加这个的另一种方式。 我正在学习本教程(没有“旁白”章节)https:

  • 我有一个Spring Boot应用程序,在其中我试图创建一个自定义安全过滤器,如下所示:

  • 下面是过滤器的外观。 对于WebSecurityConfigurerAdapter#configure(webSecurityWeb)web.忽略()中包含的路径,我希望该筛选器不会像Spring Security筛选器链的其余部分一样激发。 下面是它的样子 我希望在调用Spring Security链的其余部分时调用这个过滤器,并对web.igneration()中的路径忽略这个过滤器,就像Sp

  • 我有一个扩展类的类,它看起来像: 问题是,我可以向添加自定义吗?我浏览了和中可用的所有方法,但没有找到任何方法。但是在模式下,我发现在中有的列表。如何在此添加自定义?

  • 我希望每个请求都能收到一些信息,因此我认为与其为每个请求提供一个函数并分别从请求中获取这些信息,不如使用一个过滤器<所以每一个请求都会通过这个过滤器,我就能得到我想要的 问题是:如何编写自定义筛选器 假设它不像任何预定义的Spring Security过滤器,它是全新的。