我有一个@RolesAllowed的受保护的@无状态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);在我使用@RolesAllowed注释调用GlassFish方法之前,嵌入式EJB启动,应用程序部署完成,一切看起来都像预期的那样工作。
javax.ejb.AccessLocalException: Client not authorized for this invocation由于某些原因,我不知道如何设置容器的角色来通过安全检查。我遗漏了什么?
发布于 2012-12-27 21:02:15
您可以使用com.sun.appserv.security.ProgrammaticLogin类来帮助您解决这个问题。这是特定于GlassFish的,而不是JavaEE6API;如果您使用的是不同的嵌入式容器,则需要找到等效的容器。
ProgrammaticLogin使您能够以用户身份登录,并为当前线程建立安全主体。它的用法示例如下:
ProgrammaticLogin login = new ProgrammaticLogin();
login.login("user", "password", "file", true);其中,user和password是用于在file领域中作为用户登录的凭据。这允许您建立一个安全主体,以便在调用部署在嵌入式容器中的EJB时使用。如果不这样做,将导致匿名主体被用作主体(从而在容器实施RolesAllowed约束时导致异常)。
请注意,这还要求您使用现有的安全领域。建议您使用包含预配置domain.xml文件的自定义GlassFish安装根目录(或实例根目录),该文件带有应用程序使用的安全领域。
有关如何使用ProgrammaticLogin接口的更多详细信息,可以在this Oracle blog entry中找到。
https://stackoverflow.com/questions/14054764
复制相似问题