2013-10-09 37 views
8

我們有一個Java EE 7應用程序並使用Arquillian來測試內容。現在我們要檢查當前登錄用戶的一些權限。我的問題非常基本,如何在測試用例中登錄用戶?我已閱讀ProgrammaticLogin doesnt work in arquillian testsEmbedded Glassfish, security and Arquillian questions,但他們沒有明確回答。我目前的做法是這樣的:如何使用Arquillian測試登錄/認證 - Java EE 7

// Inject services etc. 

@Test 
public void testLogin(){ 

    UserAccount user = new UserAccount(); 
    user.setUsername("bob"); 
    user.setPassword("bob"); 
    userAccountService.save(user); 

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
     pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

現在,當我嘗試運行這一點,得到一個LoginException異常聲稱我沒有的LoginModule配置爲「fileRealm」。但是「fileRealm」不是我正在尋找的領域(我把它放在第一次測試中,但後來我將它改爲「secureJDBCRealm」,這是我們自定義的GlassFish安全領域)。我們使用arquillian-glassfish-embedded-3.1進行測試。

  • 有誰知道在哪裏定義Arquillian的領域?
  • 爲什麼我的應用程序一直在尋找fileRealm?這是默認值嗎? (在這裏找不到任何規格)

回答

3

Arquillian不提供任何支持定義領域。相反,您需要自己在容器中配置領域。使用嵌入式Glassfish容器時這有點棘手,但它是可行的。

我假設secureJDBCRealm是一個自定義領域,而不是標準/內置Glassfish領域之一。爲了在嵌入式Glassfish的容器配置自定義領域,你需要:

  1. 放置一個login.conf文件引用的境界測試類路徑上。爲此,請將配置目錄添加到資源目錄,並將login.conf置於該目錄中。你login.conf會是這個樣子

    secureJDBCRealm { 
        com.blah.blah.LoginModule required; 
    }; 
    
  2. 您的自定義域以及任何依賴關係必須在測試類路徑上。

  3. 您需要以編程方式在glassfish中創建領域。這可以通過org.glassfish.embeddable.CommandRunner完成。幸運的是,嵌入式的Arquillian集裝箱通過JNDI使得這個可用,這意味着你可以做到以下幾點:

    @Resource(mappedName = "org.glassfish.embeddable.CommandRunner") CommandRunner commandRunner; 
    
    public void configureLoginRealm() { 
        CommandResult commandResult = commandRunner.run("create-auth-realm", "--classname=com.blah.blah.SecureJDBCRealm", "--property=jaas-context= secureJDBCRealm", "secure-JDBC-realm"); 
        log.debug(commandResult.getExitStatus().toString() + " " + commandResult.getOutput()); 
        Throwable throwable = commandResult.getFailureCause(); 
        if (throwable != null) { 
         log.error(throwable.getMessage(), throwable); 
        } 
    } 
    

    }

  4. 然後,您可以通過編程方式與

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
        pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
        e.printStackTrace(); 
    } finally { 
        pl.logout(); 
    } 
    
+0

感謝登錄!但是,我們最終使用了已經預先配置了正確Realm的遠程GlassFish。遠程支持不是很久以前發佈的,所以我們一開始並沒有看到這種可能性。 – bmurauer

+1

CommanderRunner界面改變了,這不再起作用了: -/Glassfish 3.1.2.2 –