我需要一个数据库表来保存 Spring Security/jwt 的令牌吗?

问题描述 投票:0回答:1

我在 Spring Boot 项目中使用 Spring Security 进行身份验证和授权。我想向项目添加刷新令牌机制,但据我所知,这些示例包含一个名为 Token 的单独表来保存令牌数据。

但是,我想知道是否可以在不询问数据库的情况下提取当前令牌并计算它是否过期。

那么,我是否必须创建令牌表才能在 Spring Security 中使用刷新令牌?或者我可以使用刷新令牌方法而不创建单独的表吗?

视频可以做到这一点,但我不太确定这是最好的选择

java database spring-security jwt backend
1个回答
0
投票

是的,您可以轻松检查 JWT 令牌的有效性,而无需将任何内容保存到数据库 - 您只需要保留您使用的某种秘密关键字,但这通常存储在内存中,因此只要应用程序正确的 JWT 令牌就有效不重新启动。仅当您需要保持已发行 JWT 令牌的有效性并允许应用程序重新启动时,您才需要将密钥保存到数据库中,以便在重新启动后可以读出。

例如,如果您正在使用依赖项

io.jsonwebtoken:jwt
,您可以像这样设置 JWT 构建器:

public class JwtTokenService {

    private final String secret = Base64.getEncoder().encodeToString(UUID.randomUUID().toString().getBytes());

    public String createToken(String username, List<String> roleNames, long validityInMillis) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + validityInMillis);

        return Jwts.builder()
                .subject(username)
                .issuedAt(now)
                .expiration(expiryDate)
                .signWith(Keys.hmacShaKeyFor(secret.getBytes()))
                .compact();
    }

    public boolean validateToken(String token) {
        Date expirationDate = Jwts.parser()
                .verifyWith(Keys.hmacShaKeyFor(secret.getBytes()))
                .build()
                .parseSignedClaims(token)
                .getPayload().getExpiration();
        return !expirationDate.before(new Date());
    }
}

将已发行的 JWT 令牌持久保存到内存(或数据库)中的一个用例是,如果您想实现某种逻辑以使它们失效(例如注销 - 这通常是不必要的,因为 JWT 令牌的发行时间较短,但是取决于要求)。

资源:

© www.soinside.com 2019 - 2024. All rights reserved.