我可以使用@RolesAllowed上的Apache CXF实现REST风格的资源?(Can I u

2019-09-02 04:38发布


我的问题是“我可以使用@RolesAllowed上CXF实现REST风格的资源?”

首先,我解释的背景下造成这个问题。
我在一些项目中,开发商必须重新制作一些网页系统进入的一个部分工作RESTful WEB Apis.This本系统通过内置的服务器系统SpringHibernate 。 而其作为UI客户端应用程序被开发ActionScript通过FLEX framework
现在我测量的正确方法来设计和改造我们现有的系统为RESTful APIs通过阅读一些文件或开发一些prototypes.So,我们暂时决定使用Apache-CXF ver.2.7.4作为JAX-RS实现和TOMCAT ver.7为Web应用程序容器。

然后,我挣扎了用户授权的现在的方式。 如你所知,我是说这个词'Authorization'是限制某些用户访问根据用户的滚动功能像一些控制机制ROLE_ADMINROLL_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 CXFTOMCAT ,教我说,please.Or如果你可以明确得出结论,我们不能使用@RolesAllowed在框架选择Apache CXFTOMCAT请教我这个结论的背景知识。

此外,我想我可以使用@RolesAllowed在REST资源利用CXFJBOSS的应用服务器,而不是TOMCAT 。 这是假设是真的吗? 我很抱歉,我没有做一个试验,用JBOSS ,而不是TOMCAT。

最好的祝福。

Answer 1:

是的,这是可以做到。 我会假设你(像我)不想使用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 +关键@RolesAllowedSecureAnnotationsInterceptor

更新 :我应该承认, 转换新泽西州的REST例子到Apache CXF是特别有帮助,特别是对指出其连接到SecureAnnotationsInterceptor @RolesAllowed没有很好地记录在其他地方。

更新2:新泽西州CXF博客条目似乎并没有被迁移到gmazza的新博客 。 但是, 我使用的例子是在github 。 它包含了与配置文件SecureAnnotationsInterceptor定义和豆与@RolesAllowed注解



文章来源: Can I use @RolesAllowed on RESTful Resources implemented on Apache CXF?