如何在 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 列入白名单的主要内容,如果未能解决你的问题,请参考以下文章
javascript 允许在Adblock Plus中将特定频道列入白名单,方法是在URL中添加频道名称,并构建过滤器以添加自定义过滤器
如何使用CSP(内容安全策略)在WebForms项目中将动态创建的脚本列入白名单?
如何在负载均衡器 Laravel 后面的 nginx 中将远程 IP 地址列入白名单