仅在特定 URL 上调用自定义 Spring Security 过滤器

Posted

技术标签:

【中文标题】仅在特定 URL 上调用自定义 Spring Security 过滤器【英文标题】:Invoking a custom Spring Security filter only on specific URL 【发布时间】:2019-12-04 10:54:49 【问题描述】:

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

public class CustomSecurityFilter extends GenericFilterBean 

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
        //it should be invoked only for "/needCustomSecurityOnThisURL"
        chain.doFilter(request, response);
    

现在,我只想在特定的 URL 上调用它,但我无法弄清楚这一点。我正在使用以下代码调用它:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 

        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .csrf().disable() // Disable CSRF Token
            .httpBasic();

        // Disable Session Management
        http
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        //want to add the Custom Security Filter n it should ne applicable only on selected URL
        http
            .antMatcher("/needCustomSecurityOnThisURL")
            .addFilterAfter(new CustomSecurityFilter(), BasicAuthenticationFilter.class);
    

现在,我可以看到这个过滤器被添加到 Spring Security 过滤器链中的正确位置,但它会在每个请求时被调用。我不希望这样,而且我只想在特定 URL 上调用此过滤器。

我已经阅读了spring提供的指南和许多文章。但我在这方面仍然没有成功。任何指导将不胜感激。

【问题讨论】:

您的配置只能应用于 URL /needCustomSecurityOnThisURL。您是否将您的 CustomSecurityFilter 暴露为 bean? 【参考方案1】:

我用过这个:

public class CustomSecurityFilter extends GenericFilterBean 

RequestMatcher customFilterUrl = new AntPathRequestMatcher("/needCustomSecurityOnThisURL/**");



@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;

    if (customFilterUrl.matches(httpServletRequest)) 
        //it should be invoked only for "/needCustomSecurityOnThisURL"
     else 
        //"Filter NOT intercepted";
    

    chain.doFilter(request, response);


【讨论】:

为我工作。也可以用于否定,以排除某些端点。

以上是关于仅在特定 URL 上调用自定义 Spring Security 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Spring CORS 仅在某些资源上失败

Spring boot,Security,OAuth2:是不是可以使用自定义 AuthorizationCodeResourceDetails?身份验证服务器需要重定向 url 中的特定参数

Django Ajax 403 仅在从自定义 localhost url 发布时

每页 Sitemesh 自定义 javascript

仅在 magento 中显示特定用户组的自定义链接

使用自定义意图操作仅在特定应用程序上下文中启动活动