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

Posted

技术标签:

【中文标题】JAX-RS (Jersey 2) - 使用 JSR 250 注释的授权【英文标题】:JAX-RS (Jersey 2) - authorization using JSR 250 annotations 【发布时间】:2014-08-08 13:41:36 【问题描述】:

简介

球衣: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 时,我必须提供用户名和密码。这意味着数据库中的领域和配置就可以了。所以这里就不用展示了。

案例 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 Forbidden。这不是领域和数据库配置的问题,因为此配置适用于第一个示例。

所以问题是:我的第二个实现有什么问题?

提前准备好。

【问题讨论】:

【参考方案1】:

尝试将其添加到您的 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>

【讨论】:

以上是关于JAX-RS (Jersey 2) - 使用 JSR 250 注释的授权的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 JAX-RS / Jersey?

如何使用 JAX-RS 和 Jersey 处理 CORS

JAX-RS(Jersey 2 实现)内容协商,带有 URL 扩展名 .xml 或 .json

Jax-rs -jersey 跨域请求启用

如何使用JAX-RS和Jersey处理CORS

使用 JAX-RS Jersey 2.2 获取带有 Content-Type 和 Accept 标头的请求