因为Resteasy随着servlet容器运行,所以你可以使用大多数在servlet容器中可用的身份验证机制。基本和摘要身份验证可能是最容易的一种设置方式,也正好符合REST的无状态的原则。方式安全可以使用,但是需要通过每一次请求的session的cookie值。我们已经做了基于OAuth(开发性验证)的准备工作,也计划在未来做OpenID和SAML(Security Assertion Markup Language)集成。
OAuth核心 1.0a
RESTEasy 开始支持OAuth核心 1.0a。这个包括OAuth的验证支持和为受保护资源的OAuth身份验证。
要点:
这个API是实验性的,还没有成为产品,特别是对于严密安全而言。它不是最后的,还待修改。如果你有意见,故障,特别需求或者问题,可以通过下面的地址联系我们”
https://lists.sourceforge.net/lists/listinfo/RESTEasy-developers
基于OAuth身份验证
OAuth 身份验证时一个这样的过程,在这个过程中,用户被授权访问他们的受保护的资源而不用把他们的凭据和用户分享。
OAuth身份验证需要以下三个步骤:
1.用户获得了一个未被授权的请求记号。这个部分由RESTEasy控制。
2.使用者认可这个请求记号。这个部分不是由RESTEasy控制,因为它需要一个用户接口,通过这个接口用户可以登录和认可或者拒绝那个请求记号。这不是自动完成的因为他需要与用户登录过程以及用户接口相互协调完成。
3.用户用请求记号交换访问记号。这个部分由RESTEasy控制。
为了让RESTEasy提供两个URL端点,一个用于客户端请求未认可的请求记号,另一个用于以认可的请求记号去交换访问记号,你需要使OAuthServlet在你的web.xml中可用:
<!-- The OAuthServlet handles token exchange --> <servlet> <servlet-name>OAuth</servlet-name> <servlet-class>org.jboss.RESTEasy.auth.oauth.OAuthServlet</servlet-class> </servlet> <!-- This will be the base for the token exchange endpoint URL --> <servlet-mapping> <servlet-name>OAuth</servlet-name> <url-pattern>/oauth/*</url-pattern> </servlet-mapping>下面的配置选项可以使用<context-param> 节点来设置:
默认 | 描述 | |
oauth.provider.provider-class | *Required* | 定义你的OAuthProvider实现的类名 |
oauth.provider.tokens.request | /requestToken | 这个定义你端点URL,来请求未认可的请求记号 |
oauth.provider.tokens.access | /accessToken | 用认可的请求标记交换访问标记 |
访问受保护的资源
在成功的接受访问记号和记号机密后,使用者可以以用户代表的身份访问受保护的资源。
RESTEasy 支持OAuth身份验证访问受保护的资源。可以使用一个servelt过滤器,这个过滤器需要与所有的受保护的资源映射在你的web.xml中。
<!-- The OAuth Filter handles authentication for protected resources --> <filter> <filter-name>OAuth Filter</filter-name> <filter-class>org.jboss.RESTEasy.auth.oauth.OAuthFilter</filter-class> </filter> <!-- This defines the URLs which should require OAuth authentication for your protected resources --> <filter-mapping> <filter-name>OAuth Filter</filter-name> <url-pattern>/rest/*</url-pattern> </filter-mapping>下面的配置选项可以使用<context-param> 节点来设置:
选项名 | 默认 | 描述 |
oauth.provider.provider-class | *Required* | 定义你的OAuthProvider实现的类名 |
一旦通过验证,OAuth Servlet Filter将设置你的请求的规则和角色,这个可以随后用JAX-RS SecurityContext来访问。你也可以通过使用在"Securing JAX-RS and RESTeasy"章节中描述的角色保护你的资源。
实现一个OAuthProvider
为了让RESTEasy实现OAuth,你需要提供一个OAuthProvider的实例,这个实例提供访问用户列表、请求和访问记号。一双鞋不能让所有人穿着都合适,我们不知道你是否希望在配置文件中,内存中或者在永久性存储中存储你的记号和用户凭证。
你所要做的就是实现OAuthProvider接口:
public interface OAuthProvider { String getRealm(); OAuthConsumer getConsumer(String consumerKey)throws OAuthException; OAuthToken getRequestToken(String consumerKey, String requestToken) throws OAuthException; OAuthToken getAccessToken(String consumerKey, String accessToken) throws OAuthException; OAuthToken makeRequestToken(String consumerKey, String callback) throws OAuthException; OAuthToken makeAccessToken(String consumerKey, String requestToken, String verifier) throws OAuthException; String authoriseRequestToken(String consumerKey, String requestToken) throws OAuthException; void checkTimestamp(OAuthToken token, long timestamp) throws OAuthException; }如果一个用户Key或者记号不存在,或者如果时间戳不合法,简单的抛个OAuthException异常就行。
在OAuthProvider中使用的剩余的接口是:
public interface OAuthConsumer { String getKey(); String getSecret(); } public interface OAuthToken { OAuthConsumer getConsumer(); String getToken(); String getSecret(); Principal getPrincipal(); Set<String> getRoles(); }本文翻译自http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Authentication.html