Spring boot 在使用JWT设置成员资格时,使用Spring Security的UserDetailsService有什么优势吗?
我正在应用JWT来验证请求。解析和验证在我的Spring云网关中工作。 我在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
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
这是我的荣幸。