经过长时间的彻底搜索,请求帮助。我在写一封信 JwtTokenFilter
在 Spring webflux与 Spring 安全相结合。问题是这个过滤器在一个请求中被调用了两次。过滤器代码如下。
@Component
class JwtTokenAuthenticationFilter(
@Autowired val tokenProvider: JwtTokenProvider
) : WebFilter {
private val HEADER_PREFIX = "Bearer "
override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void?> {
val token = resolveToken(exchange.request)
return if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) {
val authentication: Authentication = tokenProvider.getAuthentication(token)
chain.filter(exchange)
.contextWrite(ReactiveSecurityContextHolder.withAuthentication(authentication))
} else
chain.filter(exchange)
}
private fun resolveToken(request: ServerHttpRequest): String? {
val bearerToken = request.headers.getFirst(HttpHeaders.AUTHORIZATION)
return if (StringUtils.hasText(bearerToken) && bearerToken!!.startsWith(HEADER_PREFIX)) {
bearerToken.substring(7)
} else null
}
}
这个问题可以通过删除过滤器上的@component注解来避免,但这意味着我必须在路径中创建这个对象及其所有依赖项,这完全剥夺了spring的依赖项反转的优势。因此,我想保留使用spring注解来完成工作。但是,这会产生一个问题,即过滤器在两个地方注册,即servlet容器和Spring Security 。
本文提出的解决方案讨论了这个问题。
但是找不到将该文章中的解决方案应用于webfilter的方法,因为该文章中的解决方案是针对servlet过滤器的。
那么,有没有一种方法可以避免servlet容器调用这个bean,而只允许spring security调用它呢。或者你看到的代码中有什么问题?
暂无答案!
目前还没有任何答案,快来回答吧!