在使用 JWT 设置成员资格时,使用 Spring 安全性的 UserDetailsS​​ervice 有什么优势吗?

Is there any advantage using UserDetailsService of Spring Security, when setting membership with JWT?

我正在应用 JWT 来验证请求。解析和验证在我的 Spring 云网关中工作。 我在 SecurityWebFilterChain 上创建了一个自定义过滤器,它在 header.

请求中解析和验证 JWT

我将使用 ServerHttpSecurity.addFilterBefore(myCustomJwtRequestFilter, UsernamePasswordAuthenticationFilter.class).

将此自定义过滤器添加到 ServerHttpSecurity

我想用 SecurityContextHolder.getContext().setAuthentication(authentication) 的 Spring 安全性来验证请求。

我发现它的大部分示例都使用 UserDetails 来进行身份验证 class。

我发现的大多数示例都使用 UsernamePasswordAuthenticationToken,我发现它需要 UserDetails。要构建 UserDetails,它基本上需要用户名、密码和角色。

但就我而言,我不想每次收到请求时都使用用户数据库验证我的 jwt。另外,我不需要用户密码,因为一旦我生成了令牌,我就不会验证它。我只想在 JWT 负载本身中使用用户名和角色。

总而言之,我想让 Authentication class 仅使用用户名和角色,如果使用我的自定义方法验证了解析的 jwt,则将其设置为经过身份验证。

它适用于自定义用户详细信息:

UserDetails userDetails = User.builder().username(String.valueOf(parsedInfo.get("username")))
    .authorities(parsedInfo.get("roles")).password("dummypassword").build();

但我必须在其中设置虚拟密码,我不需要。

我认为我的解决方案没有正确应用 spring 安全性。 但是,如果我不使用 UserDetails,使用 spring 安全性是否有好处?

我的情况有更好的解决方案吗?

如果您只需要验证 JWT 令牌,那么您可以使用 Spring AOP。

@Aspect
@Component
public class JwtAspect {

    @Before("execution(* com.yourpackageName.* (..))")
    public void checkJwtToken(JoinPoint joinPoint) {
        String jwtTOken = request.getToken();
        if (null == jwtToken) {
            throw new Exception("Token Not Found. ");
        }
        parseToken(jwtToken);
        joinPoint.proceed();
    }

}

如果您获得令牌,请解析它并检查过期时间。如果以上一切正常,您可以继续 JoinPoint.