我的问题是“我可以使用@RolesAllowed上CXF实现REST风格的资源?” 。
首先,我解释的背景下造成这个问题。
我在一些项目中,开发商必须重新制作一些网页系统进入的一个部分工作RESTful
WEB Apis.This本系统通过内置的服务器系统Spring
和Hibernate
。 而其作为UI客户端应用程序被开发ActionScript
通过FLEX framework
。
现在我测量的正确方法来设计和改造我们现有的系统为RESTful APIs
通过阅读一些文件或开发一些prototypes.So,我们暂时决定使用Apache-CXF ver.2.7.4
作为JAX-RS
实现和TOMCAT ver.7
为Web应用程序容器。
然后,我挣扎了用户授权的现在的方式。 如你所知,我是说这个词'Authorization'
是限制某些用户访问根据用户的滚动功能像一些控制机制ROLE_ADMIN
, ROLL_EMPLOYEE
等on.And我们的团队希望利用@RolesAllowed
注解来限制用户访问一些RESTful在方法REST
资源类。
通过调查,我知道我们可以使用@RolesAllowed
注解如果我们用Jersey
作为JAX-RS
imple和TOMCAT,因为泽西框架提供
com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory
为开发者通过添加在web.xml以下行激活@RolesAllowed注释
<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>
作为球衣的ServletContainer的初始化,PARAM。
但是,我们的团队已经决定Apache CXF
的JAX-RS imple.I've已经调查了CXF的网站网页文件的安全性和授权部分。 但我无法得到解决或如何使用@RolesAllowed
对REST的资源的方法。
所以,如果你知道的要求或如何使用@RolesAllowed
上实现基于REST资源Apache CXF
和TOMCAT
,教我说,please.Or如果你可以明确得出结论,我们不能使用@RolesAllowed
在框架选择Apache CXF
和TOMCAT
请教我这个结论的背景知识。
此外,我想我可以使用@RolesAllowed
在REST资源利用CXF
上JBOSS
的应用服务器,而不是TOMCAT
。 这是假设是真的吗? 我很抱歉,我没有做一个试验,用JBOSS
,而不是TOMCAT。
最好的祝福。
是的,这是可以做到。 我会假设你(像我)不想使用Spring Security的溶液(处理身份验证和授权),因为有似乎是充足的资源,如何使JSR-250注解使用Spring Security的一部分。
我的解决方案始于一个简单的JAX-RS项目从CXF提供的原型项目建成org.apache.cxf.archetype:cxf-jaxrs-service:2.7.5
(写作最新的GAV @时间)。
这给你一个基本HelloWorld
与支持配置文件类。
一些修改需要做。
首先,添加以下的依赖到pom.xml
:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
为什么? 因为Tomcat是不是一个完整的J2EE容器,它不支持所有的JSR-250注解(其中@RolesAllowed
就是其中之一)。 此外,尽管CXF识别并将与@RolesAllowed
,它没有捆绑一个实现中,期望它通过任一J2EE容器或API的如上列入来提供。
该servlet-api
被列出来,因为我需要它@编译时间,我想补充的方法HellowWorld.java
(见下文)。
二,修改beans.xml
如下:
<bean class="my.pkg.HelloWorld" id="helloWorldService"/>
<jaxrs:serviceBeans>
<ref bean="helloWorldService"/>
</jaxrs:serviceBeans>
<bean id="authorizationInterceptor"
class="org.apache.cxf.interceptor.security.SecureAnnotationsInterceptor">
<property name="securedObject" ref="helloWorldService" />
</bean>
该SecureAnnotationsInterceptor
就是将扫描helloWorldService
和执行@RolesAllowed
注解。
注意helloWorldService
不得不被拉出的<jaxrs:serviceBeans>
节所以它可能是既没有和引用authorizationInterceptor
。
第三,增加一些角色和用户tomcat-users.xml
或替代(如JDBC领域,等等。)我这样做:
<role rolename="hello-user" />
<role rolename="hello-role1"/>
<role rolename="hello-role2" />
<user username="hello1" password="Password1" roles="hello-role1,hello-user"/>
<user username="hello2" password="Password1" roles="hello-role2,hello-user"/>
这将创建2个用户谁都有一个共同的角色( hello-user
),加上自己独特的作用。
四,以下内容添加到web.xml
,以使BASIC
身份验证:
<security-constraint>
<web-resource-collection>
<web-resource-name>Hello Services</web-resource-name>
<url-pattern>/hello/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>hello-user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
有了这个,我决定要求的角色hello-user
下的一切/hello/*
。 这不是必要的,但要注意的是我确实有一些问题,去掉了一些节,通配符和角色......所以在这里小心尝试。
第五(最后),标记的HelloWorld.java
类:
@Path("/hello")
@RolesAllowed("hello-user")
public class HelloWorld {
@GET
@Path("/echo/{input}")
@Produces("text/plain")
@RolesAllowed("hello-role1")
public String ping(@PathParam("input") String input) {
return input;
}
@POST
@Produces("application/json")
@Consumes("application/json")
@Path("/jsonBean")
@RolesAllowed("hello-role2")
public Response modifyJson(JsonBean input) {
input.setVal2(input.getVal1());
return Response.ok().entity(input).build();
}
@GET
@Produces("text/plain")
@Path("/cliche")
public Response getClichedMessage(@Context HttpServletRequest request) {
return Response.
ok().
entity("Sending \"Hello World\" to user \"" + request.getUserPrincipal().getName() + "\"").
build();
}
}
我加了最后一个方法( getClichedMessage()
表明,因为他们有两个用户可以访问方法hello-user
与该班被注释的作用。 该SecureAnnotationsInterceptor
是足够聪明来处理。
就这样。 在我看来,这是只使用Tomcat的,CXF和BASIC authenitcation的STTCPW。 对于CXF +关键@RolesAllowed
是SecureAnnotationsInterceptor
。
更新 :我应该承认, 转换新泽西州的REST例子到Apache CXF是特别有帮助,特别是对指出其连接到SecureAnnotationsInterceptor @RolesAllowed
没有很好地记录在其他地方。
更新2:新泽西州CXF博客条目似乎并没有被迁移到gmazza
的新博客 。 但是, 我使用的例子是在github 。 它包含了与配置文件SecureAnnotationsInterceptor
定义和豆与@RolesAllowed
注解