【发布时间】: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。这不是领域和数据库配置的问题,因为此配置适用于第一个示例。
所以问题是:我的第二个实现有什么问题?
提前准备好。
【问题讨论】:
标签: java security rest jax-rs jersey-2.0