我正在使用具有Spring启动安全配置的自定义JWT过滤器,以允许没有JWT令牌的某些API请求。但是WebSecurity配置中的permissionAll()方法不起作用(不允许在没有JWT的情况下发出任何请求)。它抛出自定义 InvalidJwtException。我在这里错过了什么?我尝试了很多谷歌搜索,但没有成功。
Web安全配置类
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class WebSecurityConfig(
private val jwtTokenProvider: JwtTokenProvider,
private val filterChainExceptionHandler: FilterChainExceptionHandler,
) : WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity?) {
http?.csrf()?.disable()
http?.sessionManagement()?.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
http
?.authorizeRequests()
?.antMatchers("/api/v1/auth/signin")?.permitAll()
?.antMatchers("/api/v1/auth/checkEmailExist")?.permitAll()
?.anyRequest()?.authenticated()
http
?.addFilterBefore(JwtTokenFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter::class.java)
?.addFilterBefore(filterChainExceptionHandler, JwtTokenFilter::class.java)
}
@Bean
fun passwordEncoder(): PasswordEncoder {
return BCryptPasswordEncoder(10)
}
@Bean
override fun authenticationManagerBean(): AuthenticationManager {
return super.authenticationManagerBean()
}
}
JwtTokenFilter类
@Component
class JwtTokenFilter(
private val jwtTokenProvider: JwtTokenProvider
) : OncePerRequestFilter() {
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
filterChain: FilterChain
) {
try {
val token = jwtTokenProvider.resolveToken(request)
if (token != null && jwtTokenProvider.validateToken(token)) {
val auth = jwtTokenProvider.getAuthentication(token)
SecurityContextHolder.getContext().authentication = auth
}
} catch (e: InvalidJwtException) {
SecurityContextHolder.clearContext()
throw InvalidJwtException(e.message, e.httpStatus)
}
filterChain.doFilter(request, response)
}
}
ResolveToken函数
fun resolveToken(req: HttpServletRequest): String? {
val bearerToken = req.getHeader(AUTHORIZATION_HEADER)
return if (bearerToken != null && bearerToken.startsWith(BEARER)) {
bearerToken.substring(7)
} else {
throw InvalidJwtException("Authorization token must be Bearer [token]", HttpStatus.FORBIDDEN)
}
}
您的令牌验证应排除身份验证URL:
if (!request.getRequestURL().toString().contains("auth") || (token != null && jwtTokenProvider.validateToken(token)))
您可以选择比我使用的“身份验证”更好的字符串来标识排除的路径
问题内容: 由于我是elasticsearch的新手,因此我无法识别 ngram令牌过滤器 和 edge ngram令牌过滤器 之间的 区别 。 两者在处理令牌方面有何不同? 问题答案: 我认为文档对此非常清楚: 该标记器与nGram非常相似,但仅保留从标记开头开始的n-gram。 标记器的最佳示例再次来自文档: 使用此标记生成器定义: 简而言之: 令牌生成器将根据令牌的配置来创建令牌。在这个例子
问题内容: 如何使用带有此类JSON的NEST配置索引: 我可以使用类创建自定义分析器,但找不到如何创建自定义过滤器并将其注册到分析器中的方法。 提前致谢! 问题答案: 经过一番搜索,我找到了一个解决方案:
问题内容: 我正在尝试使用OAuth 2.0访问Google的文档列表API 3.0,但是遇到401错误的麻烦。 用户接受后,我的代码如下: 然后,在最后一行-getFeed()-引发异常: 这是怎么回事?在静态主测试类上,它的工作原理很吸引人,但是当我在服务器上运行它时,此行不再起作用。任何想法? 解决了 需要使用GoogleOAuthHelper而不是直接使用GoogleOAuthParame
演示在网关追加一个header public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 演示在网关追加heade
SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下: Bolt Filter 新建自定义 Filter 。 public class CustomFilter
我正在使用带有JWT的Spring Security来验证rest api。登录时,会生成JWT令牌并共享给移动客户端。但是,后续请求中的令牌没有经过验证。安全配置有什么问题吗? Spring Security版本-5.1.6。释放 //安全配置 //JWT Token Auth Filter——永远不会调用它 我希望登录后的所有请求都将根据JWT令牌进行身份验证。我尝试将要验证的服务的名称输入如