在 Spring Boot Gradle 项目中导入 JWT(JSON Web Token)有困难

Posted

技术标签:

【中文标题】在 Spring Boot Gradle 项目中导入 JWT(JSON Web Token)有困难【英文标题】:Difficulty importing JWT (JSON Web Token) in Spring Boot Gradle project 【发布时间】:2019-05-17 11:12:32 【问题描述】:

我有一个 Spring Boot gradle 项目,在 build.gradle 依赖项中,我将 JSON Web Token 导入为:

compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.2'

按照 Spring Security 和视频教程,我构建了一个成功的身份验证方法。但是,当我在此方法中使用 Jwts 时,它不会提示我导入与视频教程中相同的文件,实际上也不会提示任何导入选项。具体来说,在视频中(使用了Maven),添加了import的提示:

import io.jsonwebtoken

然而,在我的应用程序中,我从未获得过此选项并手动导入或导入为 import io.jsonwebtoken.*;不起作用。正如班级所表明的那样:

import io cannot be resolved 

同样,SignatureAlgorithm 方法不包含来自 JWT 的导入。

如何将 JSON Web 令牌成功导入我的 gradle 项目(或至少导入 io)。视频教程中的方法如下。 Jwts 是 web 令牌的实现,它是我遇到困难的包。

@Override
protected void successfulAuthentication(HttpServletRequest req,
                HttpServletResponse res, 
                FilterChain chain, 
                Authentication auth) throws IOException, ServletException 

    String userName = ((User) auth.getPrincipal()).getUsername();

    String token = Jwts.builder()
            .setSubject(userName)
            .setExpiration(new Date(System.currentTimeMillis() + SecurityConstants.EXPIRATION_TIME))
            .signWith(SignatureAlgorithm.HS512, SecurityConstants.TOKEN_SECRET)
            .compact();

    res.addHeader(SecurityConstants.HEADER_STRING, SecurityConstants.TOKEN_PREFIX + token);

我正在整理的项目本身在 Github 上,上面提到的课程在:

https://github.com/jwolfe890/SpringBootProject1/blob/master/src/main/java/sbootproject/security/AuthenticationFilter.java

【问题讨论】:

你的项目在github吗? 是的,这就是我说的课程github.com/jwolfe890/SpringBootProject1/blob/master/src/main/… @Dog,请检查并合并,我在您的项目中做了所需的更改:github.com/jwolfe890/SpringBootProject1/pull/1 【参考方案1】:

它在这里工作 - 参考 - https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt/0.2

     <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.2</version>
    </dependency>

如果你的应用是maven,那么插入到pom.xml文件中

【讨论】:

【参考方案2】:

我在项目文件夹中运行了下面的命令

gradlew clean build --refresh-dependencies

并在 gradle 文件中添加以下行

    compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'

它对我有用。谢谢。

【讨论】:

【参考方案3】:

我能够成功地将这些依赖项添加到 IntelliJ IDE 中的 maven 项目中。

    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>

【讨论】:

不幸的是,它对我不起作用 =(【参考方案4】:

对于在未导入 JWT 令牌依赖项时寻求答案的其他人:这似乎是 IntelliJ 中的一个错误。 将依赖项添加到另一个项目,然后重试。

【讨论】:

【参考方案5】:

所以我遇到了你的问题,你应该使用 0.2 而不是 0.2.0

对于 gradle 4.10,最好使用实现而不是编译。

implementation('io.jsonwebtoken:jjwt:0.2')

【讨论】:

那也没用。我最初将其设置为 .2,但在尝试不同版本时更改了它。我认为这可能与构建路径有关,但清理它并重新启动 Spring Tool Suite 没有奏效。 它适用于compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.2'implementation('io.jsonwebtoken:jjwt:0.2')。尝试做./gradlew clean build --refresh-dependencies 现在它告诉我“错误:无法找到或加载主类 sbootproject.SBootJpaProject1Application 原因:java.lang.ClassNotFoundException: sbootproject.SBootJpaProject1Application” 你知道为什么会这样说吗? 是的。这没有意义,因为类的布局与以前相同。【参考方案6】:

以下我从您的 github 项目 repo 中观察到的错误: 1.需要在AuthenticationFilter.java中添加import io.jsonwebtoken.SignatureAlgorithm; 2. UserService.java 有方法UserDetails loadUserByUsername(String email) throws Exception; 类似于UserDetailsService 接口中的UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;,我删除了因为两者的目的相同 3. 更新UserServiceImpl.java中的方法loadUserByUsername,并抛出UsernameNotFoundException异常而不是Exception(因为该方法是从UserDetailsService接口派生的)

我向您的 repo 提出了合并请求,更改为:https://github.com/jwolfe890/SpringBootProject1/pull/1/files

如果这不是您所期望的,请告诉我。

【讨论】:

由于某种原因,这个问题是 Spring Tool Suite 独有的。合并您的更改并切换到 Intellij 后,它起作用了。 合并我的更改后它应该可以工作(如上所述)。

以上是关于在 Spring Boot Gradle 项目中导入 JWT(JSON Web Token)有困难的主要内容,如果未能解决你的问题,请参考以下文章

多模块 Spring Boot 项目中的 Gradle 依赖插件

不能在spring boot,gradle项目中使用@Entity注解

使用Spring Boot Gradle插件的多模块项目

多模块 Gradle 项目 - 从 Spring-Boot 1.5 迁移到 2.1

Spring Boot gradle 多模块项目未解决的引用错误

Gradle 无法同步 Spring Boot 项目