4

我有一个受@RolesAllowed 保护的@Stateless EJB,我正在尝试使用嵌入式GlassFish 容器进行JUnit-4 测试。我最近克服的障碍是持久性单元和安全领域的 GlassFish 域配置。

Map<String, Object> properties = new HashMap<String, Object>();
properties.put(EJBContainer.MODULES, new File("build/classes"));
properties.put("org.glassfish.ejb.embedded.glassfish.configuration.file", 
     "test-resource/domain.xml");
ec = javax.ejb.embeddable.EJBContainer.createEJBContainer(properties);

嵌入式 GlassFish 启动,我的应用程序部署,一切似乎都按预期工作,直到我调用带有 @RolesAllowed 注释的 EJB 方法。

javax.ejb.AccessLocalException: Client not authorized for this invocation

由于某种原因,我无法弄清楚如何设置容器的角色以通过安全检查。我错过了什么?

4

1 回答 1

5

您可以使用该com.sun.appserv.security.ProgrammaticLogin课程来帮助您解决此问题。这是 GlassFish 特有的,而不是 Java EE 6 API;如果您使用不同的嵌入式容器,则需要找到等效的容器。

ProgrammaticLogin使您能够以用户身份登录并为当前线程建立安全主体。它的用法示例是:

ProgrammaticLogin login = new ProgrammaticLogin();
login.login("user", "password", "file", true);

whereuserpassword是用于在file领域中以用户身份登录的凭据。这允许您在调用部署在嵌入式容器中的 EJB 时建立要使用的安全主体。缺少此将导致匿名主体被用作主体(因此在容器强制执行RolesAllowed约束时导致异常)。

请注意,这还需要您使用现有的安全领域。建议您使用自定义 GlassFish 安装根目录(或实例根目录),其中包含一个预配置domain.xml文件,其中包含您的应用程序使用的安全领域。

有关如何使用ProgrammaticLoginAPI的更多详细信息,请参阅此 Oracle 博客条目

于 2012-12-27T13:02:15.450 回答