【问题标题】:Difficulty importing JWT (JSON Web Token) in Spring Boot Gradle project在 Spring Boot Gradle 项目中导入 JWT(JSON Web Token)有困难
【发布时间】: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

【问题讨论】:

标签: java spring-boot spring-security jwt


【解决方案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 后,它起作用了。
        • 合并我的更改后它应该可以工作(如上所述)。
        猜你喜欢
        • 2020-06-19
        • 2016-07-20
        • 1970-01-01
        • 2023-04-01
        • 2018-09-29
        • 2021-09-03
        • 2022-12-02
        • 1970-01-01
        • 2019-03-02
        相关资源
        最近更新 更多