Spring boot 在使用JWT设置成员资格时,使用Spring Security的UserDetailsService有什么优势吗?

Spring boot 在使用JWT设置成员资格时,使用Spring Security的UserDetailsService有什么优势吗?,spring-boot,spring-security,jwt,spring-cloud-gateway,spring-filter,Spring Boot,Spring Security,Jwt,Spring Cloud Gateway,Spring Filter,我正在应用JWT来验证请求。解析和验证在我的Spring云网关中工作。 我在SecurityWebFilterChain上做了一个自定义过滤器,用于解析和验证请求头中的JWT 我将使用ServerHttpSecurity.addFilterBefore(myCustomJwtRequestFilter,UsernamePasswordAuthenticationFilter.class)将此自定义筛选器添加到ServerHttpSecurity 我想用 SecurityContextHolder

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

我将使用
ServerHttpSecurity.addFilterBefore(myCustomJwtRequestFilter,UsernamePasswordAuthenticationFilter.class)
将此自定义筛选器添加到ServerHttpSecurity

我想用
SecurityContextHolder.getContext().setAuthentication(authentication)
对请求进行身份验证

我发现它的大多数示例都使用UserDetails来创建身份验证类

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

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

总之,我想只使用用户名和角色创建
身份验证
类,并在使用自定义方法验证解析的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

这是我的荣幸。