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

Spring启动安全-两个不同的过滤器

柴岳
2023-03-14

我试图用两个不同的过滤器来配置spring security。我想要的是有一些将由一个过滤器处理的网址,和一些将由其他过滤器处理的网址。这是我想到的设置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled=true)
public class SecurityConfigurationContext {

    @Order(1)
    @Configuration
    public static class ConfigurerAdapter1 extends WebSecurityConfigurerAdapter{
        ...

        @Override
        protected void configure(final HttpSecurity http) throws Exception {
            // Handlers and entry points
            http.exceptionHandling()
                .authenticationEntryPoint(MyCustomAuthenticationEntryPoint);


            http.authorizeRequests()
                .antMatchers(HttpMethod.GET, "/filter1-urls/*").hasRole("USER");


            http.addFilterBefore(myCustomFilter1, ChannelProcessingFilter.class);

            http.csrf().disable();
            http.httpBasic()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(myCustomAuthenticationService)
                .passwordEncoder(new BCryptPasswordEncoder());
        }
    }

    @Order(2)
    @Configuration
    public static class ConfigurerAdapter2 extends WebSecurityConfigurerAdapter{
        ...

        @Override
        protected void configure(final HttpSecurity http) throws Exception {
            // Handlers and entry points
            http.exceptionHandling()
                .authenticationEntryPoint(MyCustomAuthenticationEntryPoint);


            http.authorizeRequests()
                .antMatchers(HttpMethod.GET, "/filter2-urls/*").hasRole("SUPER_USER");


            http.addFilterBefore(myCustomFilter2, ChannelProcessingFilter.class);

            http.csrf().disable();
            http.httpBasic()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(myCustomAuthenticationService)
                .passwordEncoder(new BCryptPasswordEncoder());
        }
    }
}

过滤器看起来像这样:

过滤器1 :

@Component
@Order(1)
public final class MyCustomFilter1 implements Filter{

    public MyCustomFilter1() {
        super();
    }

    @Override
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
        // logic for processing filter1-urls
    }
}

过滤器2 :

@Component
@Order(2)
public final class MyCustomFilter2 implements Filter{

    public MyCustomFilter2() {
        super();
    }

    @Override
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
        // logic for processing filter2-urls
    }
}

问题是这两个过滤器都是在一个链中为每个请求调用的。我提出的任何请求,它首先通过一个过滤器,然后通过另一个,而不是仅仅通过一个。

我该怎么解决这个问题?

提前感谢。

共有1个答案

南门新荣
2023-03-14

您应该只有一个< code>ConfigurerAdapter。您可以将它组合成一个配置:

http.exceptionHandling()
            .authenticationEntryPoint(MyCustomAuthenticationEntryPoint);
http
     .authorizeRequests()
     .antMatchers(HttpMethod.GET, "/filter1-urls/*").hasRole("USER")
     .antMatchers(HttpMethod.GET, "/filter2-urls/*").hasRole("SUPER_USER");
http.addFilterBefore(myCustomFilter, ChannelProcessingFilter.class);

这两个过滤器都将被调用,因为您设置了这样的行为。您应该留下唯一的一个过滤器来实现您想要的结果。

@Component
public final class MyCustomFilter implements Filter {

    public MyCustomFilter() {
        super();
    }

    @Override
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
    // logic for processing filter2-urls and filter1-urls
    }
 }

无论如何,您的过滤器将在链中调用。如果您想拆分过滤器,您应该在过滤器中添加if语句以过滤只需要的url(您可以从ServletRequest获取请求url

@Component
public final class MyCustomFilter2 implements Filter {

    public MyCustomFilter2() {
        super();
    }

    @Override
    public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
        if (/*is filter2 urls*/) {
        // logic for processing filter2-urls
        }
    }
 }
 类似资料:
  • 我正在使用这个环境: Spring 4.0.5 Spring security 3.2.4 在我的环境中,我有一个SSO系统,我需要在这个系统中集成我的web应用程序。这个系统是私人产品。SSO机制的最终结果是在请求头中放置一个参数。所以我在申请中应该做的是: null 此场景类似于CAS集成场景;所以我从CAS集成着手;我写了我的自定义过滤器,我写了我的自定义入口点和处理请求所需的所有其他类,但

  • 问题内容: 我的问题很简单。我想在Elastica的一个查询中组合两个过滤器,一个filter_bool和一个filter_range。该代码是 我不能在$ elasticaQuery中将两个过滤器放在一起。请给我任何帮助! 谢谢! 问题答案: 为什么不将范围过滤器添加为过滤器中的另一个术语: 您需要在布尔过滤器中使用过滤器,而不是查询。注意我已经使用而不是您正在使用的范围查询。 另外,您知道您使

  • 在内部,如果出现任何异常,将被重定向&这不需要通过,可以跳过此请求。 我已经实现了OncePerRequestFilter&任何请求都不会调用它。这必须在OAuth过滤器之前调用。 让我知道这个安全配置出了什么问题。

  • 我有一个带有OAuth2授权和资源服务器的Spring引导设置。用户可以通过向发出POST请求来获取令牌。到目前为止,一切都很好。 但是,我不想通过基本auth保护,而是通过自定义安全过滤器。 一些简单的例子如何实现这一点将是非常有帮助的。谢谢!

  • 如何在链顶部的Spring Security链中插入多个自定义过滤器? 我可以通过在="FIRST"之后使用和之后尝试多个

  • 我已将过滤器配置如下,但在Spring Security Filter链之前不会调用它。我已将顺序设置为零 我使用的是Spring Boot 1.3,它支持在过滤器上设置顺序