gpt4 book ai didi

java - 只要有效,Spring Boot 就会在每个请求上刷新 JWT token

转载 作者:行者123 更新时间:2023-12-04 09:43:29 28 4
gpt4 key购买 nike

我的想法或我的愿望是在每次成功请求时刷新 JWTToken。目前,如果他的 token 已过期,用户将返回到登录掩码,并且应该保持这种状态。

但在我看来,正如我在某些应用程序中看到的那样,在成功请求后获得新 token 或至少整个时间长度是很好的。就像您的到期时间为 10 分钟,并且您发送的请求的剩余 token 时间为 3 分钟并成功,那么 token 应该在接下来的 10 分钟内再次有效。

怎么做最好?目前我正在使用标准的 Spring Security 库来验证、创建等等。我真的遵循了这个指南 https://bezkoder.com/spring-boot-jwt-authentication/ .

我想我可以用完全相同的方法刷新 token :

public String generateJwtToken(Authentication authentication) {

UserDetailsImpl userPrincipal = (UserDetailsImpl) authentication.getPrincipal();

return Jwts.builder().setSubject((userPrincipal.getUsername())).setIssuedAt(new Date())
.setExpiration(new Date((new Date()).getTime() + jwtExpirationMs))
.signWith(SignatureAlgorithm.HS512, jwtSecret).compact();
}

但要做到这一点,我需要 authentication我无法创建的对象,因为我没有像此处给出的用户名和密码:
    Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(
loginRequest.getUsername().toLowerCase(), loginRequest.getPassword()));

SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = jwtUtil.generateJwtToken(authentication);+

有什么东西可以代替 new UsernamePasswordAuthenticationToken()我可以用它吗?

最佳答案

所以在初次登录时,您创建和使用

authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(
loginRequest.getUsername().toLowerCase(), loginRequest.getPassword()));
但之后你在每个请求的标题中使用你的 jwt 并检查它的有效性。所以你会有类似的东西
if (!jwtProvider.isTokenExpired(jwt) && SecurityContextHolder.getContext().getAuthentication() == null) {
UsernamePasswordAuthenticationToken usernameAndPasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(jwtProvider.extractUsername(jwt),
null, jwtProvider.extractUserAuthorities(jwt));
usernameAndPasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(usernameAndPasswordAuthenticationToken);
}
如您所见,您可以创建 用户名密码身份验证 token 只需用户名和权限(如果需要),因为您已经使用 jwt 验证了用户,不需要再次输入他的密码。
我想在此之后,您可以使用用户名以及您需要从以前的 token 中获取的任何内容,将其提取并放入要生成的新 token 中。
我也建议你重构你的 generateJwtToken 使用 用户详情 作为参数甚至只是用户名,因为您不需要整个 认证 .您绝对没有在 token 生成中使用密码,正如我所看到的,您也没有使用权限。
附言对于这个问题,我想知道如何在每个请求上自动刷新 token :*

关于java - 只要有效,Spring Boot 就会在每个请求上刷新 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62227148/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com