1

我正在 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 库有关。

周围有人能告诉我如何解决这个问题吗?我已经猜不透了。

4

2 回答 2

2

我偶然发现了同样的问题。其原因很可能是依赖冲突。使用 jjwt 检查您是否有任何其他依赖项。对我们来说是com.twilio.sdk

您可以使用

mvn dependency:tree -Dverbose

在您确定冲突的依赖项后,您可以匹配您的 jjwt 版本或将其从依赖项中排除。

于 2020-07-31T13:35:51.880 回答
0

要从 Kotlin 运行 java 代码,请将 java 源代码放在文件夹下

主/java

此外,您的 kotlin 源代码位于 main/kotlin

于 2021-10-22T18:43:09.123 回答