JAX-RS 和 Spring Security - 获取经过身份验证的用户

Posted

技术标签:

【中文标题】JAX-RS 和 Spring Security - 获取经过身份验证的用户【英文标题】:JAX-RS and Spring Security - obtaining authenticated user 【发布时间】:2014-01-12 05:09:11 【问题描述】:

我目前正在使用 Jersey(JAX-RS 实施)和 Spring 的某些部分实现 REST API。

我已经通过 Spring Security 使用自定义过滤器和自定义 AuthenticationEntryPoint 实现了无状态身份验证,问题是,如何在我的 JAX-RS 类中获取当前用户.

我知道在 Spring MVC 中可以将 Principal 对象注入到控制器方法中,但是 JAX-RS 类呢?我想避免使用SecurityContextHolder.getContext().getAuthentication() 污染我的课程。

一种方法是创建自定义类作为该静态调用的适配器,并将其注入到我需要的每个服务类中,或者可能已经在 Spring Security 中公开了这种适配器?除了我的建议之外,在我的情况下,是否有一些“更好”的方式来获取当前登录的用户?

【问题讨论】:

【参考方案1】:

使用 JAX-RS,您可能希望定义一种可以使用 @Context 注入的 creating custom entities 方式。不幸的是,JAX-RS 规范没有说明如何做到这一点,但它的实现说明了。例如,CXF(与 Spring 配合得很好)会这样做:

public class AuthenticationContextProvider implements ContextProvider<Authentication> 
    public Authentication createContext(Message message) 
        return SecurityContextHolder.getContext().getAuthentication();
    

然后您必须注册该提供商,然后您才能这样做:

@GET
@Path("/id")
@Produces("text/plain")
public String demonstration(@PathParam("id") String id,
        @Context UriInfo ui, @Context Authentication auth) 
    // ...

您可以对泽西岛做类似的事情(如上面链接的问题所示),但我不太了解泽西岛。

【讨论】:

我几乎很想在我自己的代码中实现它,因为我已经了解了如何做到这一点。除了这是我的圣诞假期……【参考方案2】:

您可以使用@Context 注解注入 HttpServletRequest。这适用于 JAX-RS 资源方法参数和 JAX-RS 资源字段。也许这可以帮助你?

【讨论】:

以上是关于JAX-RS 和 Spring Security - 获取经过身份验证的用户的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring security 和/或 shiro 的最佳实践

JAX-RS 和 和 Spring 整合开发

jax-rs RESTful 服务的 spring 安全配置

Spring-boot - 如何同时使用 Resteasy JAX-RS 和 Spring MVC 控制器

JAX-RS(基于Jersey) + Spring 4.x + MyBatis构建REST服务架构

Spring Boot与JAX-RS框架Jersey的完美搭配