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 这里有一个这个答案的例子:***.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
使用 JAX-RS Jersey 进行身份验证和授权的简便方法