2012-12-27 63 views
3

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

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 

出于某种原因,我想不出如何设置容器的角色来通过安全检查。我错过了什么?

回答

5

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

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

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

其中userpassword是凭据用于登录作为file领域中的用户。这允许您在调用部署在嵌入容器中的EJB时建立一个安全主体。如果不存在这种情况,则会导致匿名主体被用作主体(因此当容器执行RolesAllowed约束时会导致异常)。

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

有关如何使用ProgrammaticLogin API的更多详细信息,请参阅this Oracle blog entry

+0

ProgramgyLogin in'glassfish/modules/security.jar' 确保领域配置正确。 如果需要,有助于日志记录javax.enterprise.system.core.security.level = FINE' –

相关问题