如何使用Arquillian测试登录/身份validation – Java EE 7

我们有一个Java EE 7应用程序,并使用Arquillian来测试东西。 现在我们要检查当前登录用户的一些权限。 我的问题很基本,如何在测试用例中登录用户? 我读过ProgrammaticLogin在arquillian测试和嵌入式Glassfish,安全性和Arquillian问题上都没有用,但是没有明确回答。 我目前的做法是这样的:

// 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,声称我没有为“fileRealm”配置LoginModule。 但是“fileRealm”不是我正在寻找的领域(我把它放在那里进行第一次测试,但后来我将其改为“secureJDBCRealm”,这是我们为GlassFish定制的安全领域)。 我们使用arquillian-glassfish-embedded-3.1进行测试。

  • 有谁知道在哪里定义Arquillian王国?
  • 为什么我的应用程序一直在寻找fileRealm? 这是默认值吗? (在这里找不到任何规格)

Arquillian不为定义领域提供任何支持。 相反,您需要自己在容器中配置域。 使用嵌入式Glassfish容器时这有点棘手,但它是可行的。

我假设secureJDBCRealm是一个自定义领域而不是标准/内置Glassfish领域之一。 要在嵌入式Glassfish容器中配置自定义域,您需要:

  1. login.conf文件放在引用该领域的测试类路径上。 为此,请将config目录添加到资源目录,并将login.conf放在该目录中。 你的login.conf看起来像这样

     secureJDBCRealm { com.blah.blah.LoginModule required; }; 
  2. 您的自定义领域以及任何依赖项都需要位于测试类路径上。

  3. 您需要以编程方式在glassfish中创建领域。 这可以通过org.glassfish.embeddable.CommandRunner完成。 幸运的是Arquillian Embedded Container通过JNDI提供了这个function,这意味着您可以执行以下操作:

     @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(); } 
Interesting Posts