我一直在尝试保护一个应用程序,该应用程序使用注释而不是部署描述符部署到 glassfish 3。但是,我无法让它正常工作。如果我尝试访问该服务,最终会出现服务器错误 500,其中显示以下消息:
type Exception report
message
descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: javax.ejb.AccessLocalException: Client not authorized for this invocation
root cause
javax.ejb.AccessLocalException: Client not authorized for this invocation
EJB 看起来像这样:
@Path("/myresource")
@Stateless
@RolesAllowed("user-role")
public class MyResource {
@GET
@Path("/{uuid}")
public Response getData(@PathParam("uuid") final String uuid) {
....
}
}
太阳-web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Servlet 3.0//EN"
"http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-0.dtd">
<sun-web-app>
<security-role-mapping>
<role-name>user-role</role-name>
<group-name>user-group</group-name>
</security-role-mapping>
</sun-web-app>
这是 web.xml:
<web-app id="myservice" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>org.test.myservice</display-name>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.test.myservice.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>file</realm-name>
</login-config>
<security-role>
<role-name>user-role</role-name>
</security-role>
</web-app>
glassfish 中的文件领域是使用 sun-web.xml 中指定的用户和角色设置的,并且在通过部署描述符设置应用程序安全性时运行良好。
如果我正确理解了本文档,我不必链接安全角色引用(如果它们的名称相同)。http://docs.oracle.com/javaee/5/tutorial/doc/bnbyl.html#bnbyt 有什么我想念的想法吗?
编辑 与无法通过注解指定所需信息的问题相关,还有一个问题,引起了我对这个问题的思考。也许这会使最初的问题更清楚一点:以上面的例子为例,资源 /myresource/* 仅适用于角色为“user-role”的用户。但是,如果在路径 /myresource/*/thumbnail (转换为 /myresource/[uuid]/thumbnail)处有第二个资源应该无需身份验证即可使用,则通过使用 url-mapping 指定安全约束是不可能的,因为似乎不可能在常量之间使用通配符。但是,这可以通过指定角色来实现,这些角色允许通过注释访问方法。如上所述,我无法这样做。这样的映射怎么可能完成?