【问题标题】:User authentication on a Jersey REST serviceJersey REST 服务上的用户身份验证
【发布时间】:2011-02-23 13:13:06
【问题描述】:

我正在开发一个使用 Jersey 框架的 REST 应用程序。我想知道如何控制用户身份验证。找了很多地方,找到最接近的文章是这样的:http://weblogs.java.net/blog/2008/03/07/authentication-jersey

但是,本文只能与 GlassFish 服务器和附加数据库一起使用。无论如何,我可以在 Jersey 中实现一个接口,并在到达请求的 REST 资源之前将其用作过滤器吗?

我现在想使用基本身份验证,但它应该足够灵活,以便我以后可以更改它。

【问题讨论】:

    标签: java http authentication jersey


    【解决方案1】:

    我已成功使用 Spring Security 来保护基于 Jersey 的 API。它具有可插入的身份验证方案,允许您稍后从基本身份验证切换到其他身份验证。我一般不使用 Spring,只是安全性的东西。

    这是我的 web.xml 中的相关部分

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/security-applicationContext.xml,
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    
    <!-- Enables Spring Security -->
    
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
        <init-param>
            <param-name>targetBeanName</param-name>
            <param-value>springSecurityFilterChain</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    
    </filter-mapping>
    

    您可以将 applicationContext.xml 留空 ()。可以找到 security-applicationContext.xml 的示例here

    【讨论】:

    • 您共享的代码片段不再存在于 security-applicationContext.xml
    • 这里有一个这个答案的例子:stackoverflow.com/a/20882134/320791
    • 我已经用一个包含示例 security-applicationContext.xml 的 gist 替换了死的 sn-p
    【解决方案2】:

    我正在做类似的事情。在我的实现中,我们有 Apache httpd 前端来处理 HTTP Basic 身份验证,它只是转发所有带有一些包含用户和角色的标头信息的请求。

    从那时起,我正在使用servlet filter 解析这些片段,以使用我在CodeRanch 上找到的帖子包装HttpServletRequest。这允许我在要过滤的每个资源上使用 javax.annotation.security 注释,例如 @RolesAllowed。然而,为了让所有这些部分正常工作,我必须在 web.xml 中的 servlet 中添加以下内容:

    <servlet>
      <!-- some other settings and such 
      ... -->
      <init-param>
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value>
      </init-param>
      ...
    </servlet>
    

    您可能会发现 Eric Warriner 在最近感兴趣的帖子中的回答: Jersey, Tomcat and Security Annotations

    【讨论】:

    • 实现自定义包装器和过滤器后,如何连接它们以便在资源请求时调用它们?
    • 你是怎么做到的?我正在寻找一种方法来做到这一点,也许您可​​以提供一些您使用的代码?
    【解决方案3】:

    看看这里,我正在尝试,但看起来很有希望:

    http://anismiles.wordpress.com/2012/03/02/securing-versioning-and-auditing-rest-jax-rs-jersey-apis/

    此示例比尝试实现 JASPI/JASPIC 简单得多,并且为各个方法(@RolesAllowed、@PermitAll、@DenyAll 等)提供了更好的粒度。

    (我知道这是一个旧线程,但只是添加了可能有用的信息)

    【讨论】:

      【解决方案4】:

      当然,您可以为此使用传统的 servlet 过滤器。

      将过滤器添加到您的 web.xml,检查您正在使用的任何身份验证标头(基本或摘要),根据这些值执行身份验证逻辑,并将结果存储在会话属性中。在您的 Jersey 资源(可能是 ctor)中,从 session 属性中提取身份验证结果,并根据这是否是您需要的结果继续处理。

      您的 Jersey 资源 ctor 可能如下所示:

      protected AbstractResource(@Context ServletContext servletContext, 
          @Context HttpServletRequest httpServletRequest) {
      
          ...
      
          HttpSession session = httpServletRequest.getSession();
          // get whatever you put in the session in the auth filter here and compare
      }
      

      【讨论】:

        【解决方案5】:

        您可以通过两种方式来实现,或者您编写一个简单的 servlet 过滤器,或者您必须实现一个 ResourceFilterFactory 并在 ContainerRequestFilter 中处理身份验证。详细代码在链接http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html。我个人喜欢 servlet 过滤器方法,因为它提供了完整的生命周期控制。但是,如果您需要更具体的东西,例如访问 QueryParams 或 PathParams,那么 ResourceFilterFactory 是您的最佳选择。

        【讨论】:

          猜你喜欢
          • 2019-07-30
          • 1970-01-01
          • 2013-11-12
          • 2015-09-16
          • 2020-06-24
          • 2014-12-25
          • 1970-01-01
          • 1970-01-01
          • 2013-06-22
          相关资源
          最近更新 更多