gpt4 book ai didi

java - 如何使用 Arquillian - Java EE 7 测试登录/身份验证

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:45 24 4
gpt4 key购买 nike

我们有一个 Java EE 7 应用程序并使用 Arquillian 进行测试。现在我们要检查当前登录用户的一些权限。我的问题很基本,在测试用例中如何登录用户?我读过ProgrammaticLogin doesnt work in arquillian testsEmbedded Glassfish, security and Arquillian questions但他们没有明确回答。我目前的做法是这样的:

// 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 文件放在引用领域的测试类路径上。为此,将配置目录添加到您的资源目录,并将 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();
    }

关于java - 如何使用 Arquillian - Java EE 7 测试登录/身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19271446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com