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 注释的授权的主要内容,如果未能解决你的问题,请参考以下文章