【问题标题】:JAX-RS and Spring Security - obtaining authenticated userJAX-RS 和 Spring Security - 获取经过身份验证的用户
【发布时间】: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 中公开了这种适配器?除了我的建议之外,在我的情况下,是否有一些“更好”的方式来获取当前登录的用户?

【问题讨论】:

    标签: java spring spring-security jersey jax-rs


    【解决方案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 资源字段。也许这可以帮助你?

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 2014-08-30
      • 2014-10-03
      • 1970-01-01
      • 2013-04-23
      • 2010-10-20
      • 2020-10-20
      • 2015-08-09
      • 2015-12-18
      相关资源
      最近更新 更多