Я хочу внедрить аудит 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()
}
}
}
Есть ли чистый метод, который я могу использовать для передачи объекта AuthUser, созданного в классе AuthenticationHandler, из класса AuditorAware?