在使用 JWT 设置成员资格时,使用 Spring 安全性的 UserDetailsService 有什么优势吗?
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
.
我正在应用 JWT 来验证请求。解析和验证在我的 Spring 云网关中工作。
我在 SecurityWebFilterChain
上创建了一个自定义过滤器,它在 header.
我将使用 ServerHttpSecurity.addFilterBefore(myCustomJwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
.
我想用
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
.