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 RESTful 服务的 spring 安全配置
Spring-boot - 如何同时使用 Resteasy JAX-RS 和 Spring MVC 控制器