如何使用嵌入式glassfish测试@RolesAllowed安全EJB3.1

Ian*_*tek 3 junit glassfish-embedded ejb-3.1

我有一个@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);
Run Code Online (Sandbox Code Playgroud)

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

javax.ejb.AccessLocalException: Client not authorized for this invocation
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*lds 5

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

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

ProgrammaticLogin login = new ProgrammaticLogin();
login.login("user", "password", "file", true);
Run Code Online (Sandbox Code Playgroud)

where userpassword是用于在域中以用户身份登录的凭据file.这允许您在调用嵌入式容器中部署的EJB时建立要使用的安全主体.如果没有这个,将导致匿名主体被用作主体(因此当容器强制执行RolesAllowed约束时会导致异常).

请注意,这还要求您使用现有的安全领域.建议您使用包含预配置domain.xml文件的自定义GlassFish安装根(或实例根),该文件具有应用程序使用的安全领域.

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