如何在 JWT 过滤器中将 api 列入白名单

Posted

技术标签:

【中文标题】如何在 JWT 过滤器中将 api 列入白名单【英文标题】:How do i whitelist api in JWT Filter 【发布时间】:2020-07-17 23:25:02 【问题描述】:

我有SpringSecurityWebAppConfig 类,它使用我自己的过滤器类JwtAuthenticationFilter

现在的问题是,对于没有请求标头和/或令牌的 api 调用,如何绕过我的 JwtAuthenticationFilter。我是否将其设置为可配置并在过滤器中读取?

我的JwtAuthenticationFilter 是从另一个库导入的类。目的是为其他微服务重用该文件。

例子:

/scanFile 不需要请求令牌。当我添加到 SpringSecurityWebAppConfig 中时。我的过滤器抛出 401,因为它没有请求令牌。

SpringSecurityWebAppConfig 类:

public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    public JwtAuthenticationFilter jwtAuthenticationFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/homePage").access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
            .antMatchers("/userPage").access("hasRole('ROLE_USER')")
            .antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')")
            .antMatchers(HttpMethod.DELETE, "/data").access("hasRole('ROLE_ADMIN')")
            .antMatchers("/login").permitAll()
            .antMatchers("/logout").authenticated()
            .and()
            .anonymous().disable()
            .exceptionHandling()
            .authenticationEntryPoint(new CustomAuthenticationEntryPoint())
            .and()
            .headers()
            .httpStrictTransportSecurity()
            .includeSubDomains(true).maxAgeInSeconds(31536000);


        // Add a filter to validate the tokens with every request
        http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
    

JwtAuthenticationFilter 类:

 private void getJwtFromRequest(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException 


            String bearerToken = request.getHeader("Authorization");

            // Step 1: Check if bearer token exist in authorization header and if bearer token start with "Bearer "
            if (!StringUtils.hasText(bearerToken) || !bearerToken.startsWith("Bearer ")) 

                String errorMsg = "No access token found in request headers.";

                Error err = new Error(JWT_AUTHENTICATION_FILTER, "AccessTokenMissingException", errorMsg);

                // Java object to JSON string
                String jsonString = mapper.writeValueAsString(err);

                log.error(jsonString);

                throw new AccessTokenMissingException(errorMsg);
            

//rest of the processing here ...

【问题讨论】:

【参考方案1】:

所以即使没有 Spring Security 身份验证,您也想将某些 API 列入白名单?

您可以在 SpringSecurityWebAppConfig 中使用 web.ignoring().antMatchers() 来从 Spring Security 中排除 url。

@Override
public void configure(WebSecurity web) throws Exception 
    web.ignoring().antMatchers("/scanFile/**”);

【讨论】:

不适合我。我的 JwtAuthenticationFilter 是从另一个库导入的。不确定这是否会影响结果。 添加代码sn-p后得到了什么?也请尝试在 /scanFile 后添加 /** 我仍然收到 401 异常,因为它仍在通过我的过滤器运行

以上是关于如何在 JWT 过滤器中将 api 列入白名单的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 对列入白名单的链接说“域未列入白名单”

javascript 允许在Adblock Plus中将特定频道列入白名单,方法是在URL中添加频道名称,并构建过滤器以添加自定义过滤器

如何使用CSP(内容安全策略)在WebForms项目中将动态创建的脚本列入白名单?

如何在负载均衡器 Laravel 后面的 nginx 中将远程 IP 地址列入白名单

在 Debezium Mysql 连接器中将更多表列入白名单的有效方法

在离子应用程序中将域列入白名单