Доступ к аутентифицированному пользователю из другого класса (без SecurityContextHolder) - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу внедрить аудит 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...