JAX-RS(Jersey 2) - 使用JSR 250注释的授权

时间:2014-06-18 09:56:04

标签: java security rest jax-rs jersey-2.0

简介

泽西岛:2.9

Jersey documentation的这一部分描述了如何为REST服务提供授权。有两种方法可以做到这一点:

  • 标准Servlet方式,使用web.xml中的配置
  • 使用JSR 250注释的更好的解决方案

第一种方法工作正常,但我无法完成第二项工作。

案例1(使用web.xml):

此示例有效。它是出于提供信息的目的。如果你想跳第二个,那就不行了。

资源非常简单:

@Path("/HelloWorld")
public class HelloWorldResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHelloWorld(){
         return "Hello World!!!";
    }
}

安全配置放在web.xml文件中,如下所示:

<web-app ...>

    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
    </servlet>

    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <!-- SECURITY -->

    <security-constraint>
        <web-resource-collection>
            <url-pattern>/rest/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>boss</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>DefaultRealm</realm-name>
    </login-config>

</web-app>

这个例子很好用。当我尝试访问http:// {myhost}:8080 / {war_name} / rest / HelloWorld时,我必须提供用户名和密码。这意味着Realm和数据库中的配置就可以了。所以没有必要在这里显示它。

案例2(JSR 250注释):

此示例不起作用。资源几乎与第一个示例中的相同,只添加了一些注释:

@Path("/HelloWorld")
@PermitAll
public class HelloWorldResource {

    @RolesAllowed("boss")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHelloWorld(){
        return "Hello World!!!";
    }
}

如您所见,添加了两个注释。它与第一个示例中的安全策略相同,但使用了web.xml注释的定义。

现在web.xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>

    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>DefaultRealm</realm-name>
    </login-config>

</web-app>

此外,还添加了新类(如文档中所述):

@ApplicationPath("rest")
public class MyApplication extends ResourceConfig {
    public MyApplication() {
        super(HelloWorldResource.class);
        register(RolesAllowedDynamicFeature.class);     
    }
}

这门课很重要。如您所见,已注册RolesAllowedDynamicFeature。 所以有两个主要步骤:   - 向资源添加注释   - 注册RolesAllowedDynamicFeature 完成了。

问题:

第二个例子不起作用。弹出窗口提供的用户名和密码永远不会显示出来。每次回复都是403禁止。这不是Realm和数据库配置的问题,因为这个配置适用于第一个示例。

所以问题是:我的第二次实施有什么问题?

提前Tnaks。

1 个答案:

答案 0 :(得分:0)

尝试将此添加到web.xml块

,而不是ResourceConfig子类
<init-param>
            <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
            <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourcFilterFactory</param-value>
        </init-param>