【发布时间】:2019-12-26 10:56:52
【问题描述】:
我正在 Kotlin 中开发一个小型 Spring Boot 应用程序,现在我想使用 JJWT 保护它。粗略地说,我正在将本教程翻译成我的用例:https://jakublesko.com/spring-security-with-jwt/
在项目中我有这个 AuthenticationFilter:
class JwtAuthenticationFilter(val authManager: AuthenticationManager) : UsernamePasswordAuthenticationFilter() {
// other stuff omitted for brevity
override fun successfulAuthentication(request: HttpServletRequest?, response: HttpServletResponse?, chain: FilterChain?, authResult: Authentication?) {
val user = authResult?.principal as User
val roles = user.authorities
.stream()
.map(GrantedAuthority::getAuthority)
val signingKey = JWT_SECRET.toByteArray()
val token = Jwts.builder()
.signWith(SignatureAlgorithm.HS512, Keys.hmacShaKeyFor(signingKey))
.setHeaderParam("typ", TOKEN_TYPE) // validate that "typ" does not actually mean "type"
.setIssuer(TOKEN_ISSUER)
.setAudience(TOKEN_AUDIENCE)
.setSubject(user.username)
.setExpiration(Date(System.currentTimeMillis() + 864000000))
.claim("rol", roles)
.compact()
response?.addHeader(TOKEN_HEADER, TOKEN_PREFIX + token)
}
}
当我发布到应该发布令牌的身份验证 URL 时,我收到:
java.lang.NoSuchMethodError: io.jsonwebtoken.SignatureAlgorithm.getMinKeyLength()I
at io.jsonwebtoken.security.Keys.hmacShaKeyFor(Keys.java:69) ~[jjwt-api-0.10.7.jar:na]
我可以调试successfulAuthentication 方法,看到它是用合理的参数调用的。引起我注意的是getMinKeyLength()I末尾括号后面的“我”。我的谷歌搜索技能显然不足以找到它存在的原因,但我强烈怀疑它与反射和从 Kotlin 代码调用 Java 库有关。
有谁可以告诉我如何解决这个问题?我已经猜不透了。
【问题讨论】:
-
JJWT 0.10.7 的 Keys.java 第 69 行只是一个标准(非反射)Java 方法调用:github.com/jwtk/jjwt/blob/0.10.7/api/src/main/java/io/…。我不知道为什么 Kotlin 会遇到问题 - 我希望我了解自己:/
-
你能解决这个问题吗?运气好吗?
-
不幸的是,没有。 ://
-
我想知道它可能是什么 - 这是一个普通的 Java 调用,没有反射。 ://
-
这看起来像是依赖版本问题。请注意,您的“signwith()”的参数顺序与您的示例不同。使用该示例中的相同版本再次尝试 - '0.10.5'。
标签: spring-boot kotlin jjwt