8

我们有一个 Java EE 7 应用程序并使用 Arquillian 进行测试。现在我们要检查当前登录用户的一些权限。我的问题很基本,在测试用例中如何登录用户?我已阅读ProgrammaticLogin 在 arquillian 测试Embedded 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?这是默认值吗?(在这里找不到任何规格)
4

1 回答 1

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 Embedded Container 通过 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();
    }
    
于 2013-12-05T22:18:44.733 回答