从其他类访问经过身份验证的用户(不带SecurityContextHolder)

时间:2019-09-25 22:41:24

标签: java spring spring-data

我想在我的微服务中实现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对象?

0 个答案:

没有答案