2012-12-27 64 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' –

相關問題