gpt4 book ai didi

spring - JWT 身份验证,无需在每个请求中获取用户详细信息

转载 作者:行者123 更新时间:2023-12-04 02:59:30 25 4
gpt4 key购买 nike

我正在 Spring Security 中实现 JWT 身份验证。我有预定义的角色,例如。普通用户、管理员等

我有以下 token 负载:

{
"sub": "nick",
"iat": "<some_date>",
"exp": "<some_date+1h>",
"scopes": [
"ROLE_USER",
"ROLE_ADMIN"
]
}

到目前为止,我看到的大多数实现都是根据 id/username/email 从数据库中检索用户详细信息,然后使用这些数据来创建身份验证(例如,通过身份验证 UsernamePasswordAuthenticationToken)。对我来说,这实际上是一种更可取的方式,因为我始终拥有最新的权限和限制(例如,用户是否被禁止)并且与 yield 相比,时间开销并没有那么大。

我只是好奇如何仅基于传入请求中包含的角色(在其授权 header token 中)使用 Spring Security 实现授权。我希望能够在请求被适当路由后访问 Controller 中的用户标识符。仅基于检查过期时间和角色有效性的 token 验证是否足够?

最佳答案

由于有关用户角色的信息是 token 的一部分(在 scopesclaim 中),因此可以仅基于 token 创建身份验证对象,而无需进一步访问数据库。

在下面的示例中,createAuthentication() 方法将 token 转换为 Spring Security Authentication 对象。

public class JWTFilter extends GenericFilterBean {

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {

HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String jwt = // resolveToken(httpServletRequest);

this.createAuthentication(jwt).ifPresent(authentication -> {
SecurityContextHolder.getContext().setAuthentication(authentication);
});

filterChain.doFilter(servletRequest, servletResponse);
}


public Optional<Authentication> createAuthentication(String token) {

Jws<Claims> jwsClaims = validateToken(token);
if (jwsClaims == null) {
return Optional.empty();
}

Claims claims = jwsClaims.getBody();

String scopesString = claims.get("scopes").toString();
String[] authStrings = scopesString.split(",");

Collection<? extends GrantedAuthority> authorities =
Arrays.stream(authStrings)
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());

String subject = claims.getSubject();
org.springframework.security.core.userdetails.User principal = new User(subject, "", authorities);

return Optional.of(new UsernamePasswordAuthenticationToken(principal, token, authorities));
}

private Jws<Claims> validateToken(String authToken) {
try {
Jws<Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken);
return claims;
} catch ...
}

}

关于spring - JWT 身份验证,无需在每个请求中获取用户详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50572339/

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