java - Spring 安全智威汤逊

标签 java spring spring-security jwt jwt-auth

我正在尝试使用 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 的示例?

最佳答案

你可以使用

<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");

其他可以查看here org.springframework.security.jwt.JwtHelper

的一些例子

编辑: 在版本 1.1.0.RELEASE JwtHelper已弃用,您可以使用 migration guide

关于java - Spring 安全智威汤逊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61070170/

相关文章:

java - 使用 JdbcBatchItemWriter 更新重复键

java - Spring Boot 中的 CrudRespository 方法在哪里实现?

java - Spring登录x,y参数

jar 中的 Java 访问文件导致 java.nio.file.FileSystemNotFoundException

java - 将参数 System.out::println 赋予方法

java - Spring Data - 自定义查询 : count and list

java - 如何确保 Spring Security 安全资源服务器仅接受来自自己应用程序的 JWT token

spring - TAM Webseal + spring 预认证

java - 使用 BufferedReader 在 java 中获取输入

java - 不支持发布方式