Jersey REST 服务上的用户身份验证

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 这里有一个这个答案的例子:***.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 是您的最佳选择。

【讨论】:

以上是关于Jersey REST 服务上的用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

通过不同域上的 REST Web 服务进行用户身份验证 - asp.net

多个应用程序上的 SSO 和 REST Api 身份验证

使用 JWT 联合身份的 REST 身份验证/授权

使用 JAX-RS Jersey 进行身份验证和授权的简便方法

使用 JAX-RS Jersey 进行身份验证和授权的简便方法

REST API 上的用户注册/身份验证流程