【问题标题】:Spring security JWTSpring 安全 JWT
【发布时间】:2020-07-19 01:31:15
【问题描述】:

我正在尝试使用 Spring 安全性实现基于 JWT 的身份验证。

目前,使用以下依赖项。

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.10.7</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.10.7</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.10.7</version>
    <scope>runtime</scope>
</dependency>

JWtUtil 类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

@Component
public class JWTUtil implements Serializable {
    private static final long serialVersionUID = 1L;

    @Value("${springbootwebfluxjjwt.jjwt.secret}")
    private String secret;

    @Value("${springbootwebfluxjjwt.jjwt.expiration}")
    private String expirationTime;

    public Claims getAllClaimsFromToken(String token) {
        return Jwts.parser().setSigningKey(Base64.getEncoder().encodeToString(secret.getBytes())).parseClaimsJws(token)
                .getBody();
    }

    public String getUsernameFromToken(String token) {
        return getAllClaimsFromToken(token).getSubject();
    }

    public Date getExpirationDateFromToken(String token) {
        return getAllClaimsFromToken(token).getExpiration();
    }

    private Boolean isTokenExpired(String token) {
        final Date expiration = getExpirationDateFromToken(token);
        return expiration.before(new Date());
    }

    public String generateToken(User user) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("role", user.getRoles());
        return doGenerateToken(claims, user.getUsername());
    }

    private String doGenerateToken(Map<String, Object> claims, String username) {
        Long expirationTimeLong = Long.parseLong(expirationTime); // in second

        final Date createdDate = new Date();
        final Date expirationDate = new Date(createdDate.getTime() + expirationTimeLong * 1000);

        return Jwts.builder().setClaims(claims).setSubject(username).setIssuedAt(createdDate)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, Base64.getEncoder().encodeToString(secret.getBytes())).compact();
    }

    public Boolean validateToken(String token) {
        return !isTokenExpired(token);
    }
}

遇到了 JWT 的 spring 依赖项。但是找不到对应的API。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.1.0.RELEASE</version>
</dependency>

有没有使用 spring-security-jwt API 转换当前 JWTUtil 的示例?

【问题讨论】:

    标签: java spring spring-security jwt jwt-auth


    【解决方案1】:

    你可以使用

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-jwt</artifactId>
        <version>1.0.11.RELEASE</version>
    </dependency>
    

    Java 代码:

    //decode using token as String
    Jwt decodedJwt = JwtHelper.decode(jwtToken);
    //get Claims
    JSONObject claims = new JSONObject(decodedJwt.getClaims());
    //get expiration date
    Date exp = new Date(claims.getLong("exp"));
    //get subject
    claims.getString("sub");
    

    另外你可以查看hereorg.springframework.security.jwt.JwtHelper的一些例子

    编辑: 在版本1.1.0.RELEASE JwtHelperdeprecated,你可以使用migration guide

    【讨论】:

      【解决方案2】:

      我正在使用带有 jwt 的 spring security,我的依赖是这个:

      <dependency>
          <groupId>com.auth0</groupId>
          <artifactId>java-jwt</artifactId>
          <version>3.10.0</version>
      </dependency>
      

      【讨论】:

      猜你喜欢
      • 2021-07-14
      • 2019-03-18
      • 2017-07-04
      • 2023-04-04
      • 2020-08-17
      • 2019-02-05
      • 2019-08-06
      • 2017-04-04
      • 2019-03-08
      相关资源
      最近更新 更多