我想在我的微服务中实现mongodb审计,但我不知道如何处理AuditorAware类中已通过身份验证的用户。 在单例应用程序中,我们可以使用 SecurityContextHolder 处理用户。但就我而言, SecurityContextHolder 仅在zuul微服务(我在其中管理安全性)中可用。 因此,我不能使用 AuditorAware 类的示例。
class SpringSecurityAuditAwareImpl implements AuditorAware<Long> {
@Override
public Optional<Long> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null ||
!authentication.isAuthenticated() ||
authentication instanceof AnonymousAuthenticationToken) {
return Optional.empty();
}
UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal();
return Optional.ofNullable(userPrincipal.getId());
}
为了将身份验证传递给我的微服务的控制器,我创建了此类,该类提取每个请求中的令牌,构造经过身份验证的用户对象,并将其注入到控制器方法的参数中
class AuthenticationHandler : HandlerMethodArgumentResolver
{
@Autowired
private lateinit var tokenUtils : TokenUtils
override fun supportsParameter(parameter : MethodParameter) : Boolean
{
return parameter.hasParameterAnnotation(Authentication::class.java)
&& parameter.parameterType == AuthUser::class.java
&& (parameter.getParameterAnnotation(Authentication::class.java)?.required == true)
}
override fun resolveArgument(parameter : MethodParameter,mavContainer : ModelAndViewContainer?, webRequest : NativeWebRequest,binderFactory : WebDataBinderFactory?) : AuthUser
{
return try
{
val token : String? = tokenUtils.getTokenHeader(webRequest)
tokenUtils.getUser(token!!)!!
}
catch (exception : Exception)
{
throw UnauthorizedException()
}
}
}
有没有一种干净的方法可以用来从AuditorAware类传递在AuthenticationHandler类中创建的AuthUser对象?