当前位置: 首页 > 面试题库 >

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

洪旻
2023-03-14
问题内容

我们有一个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?这是默认值吗?(在这里找不到任何规格)

问题答案:

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嵌入式容器通过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);
    }
    }

}

  1. 然后,您可以通过编程方式登录
    ProgrammaticLogin pl = new ProgrammaticLogin();
    

    String realmName = “secureJDBCRealm”;
    try {
    pl.login(“bob”, “bob”.toCharArray(), realmName, true);
    } catch (Exception e){
    e.printStackTrace();
    } finally {
    pl.logout();
    }



 类似资料:
  • 问题内容: 我正在开发Flask应用程序,并使用Flask-security进行用户身份验证(反过来又在下面使用Flask-login)。 我有一条需要身份验证的路由。我正在尝试编写一个单元测试,该测试对经过身份验证的用户返回适当的响应。 在单元测试中,我正在创建一个用户并以该用户身份登录,如下所示: 在测试内返回正确的用户。但是,请求的视图始终返回的。 所述路线定义为: 我可以肯定我只是不完全了

  • 我不知道如何开玩笑模拟Firebase身份验证与谷歌登录正确。我有以下代码: 易于理解的tsx 易于理解的测验tsx 如有任何帮助,请举例说明?

  • 使用,https://github.com/firebase/FirebaseUI-Android/tree/master/codelabs/chat作为登录的参考,我在键入时似乎遇到了问题 我只能键入Auth的提供者,而不能键入,为什么会这样,它提示我键入社会提供者。

  • 该应用程序应该接受用户电子邮件和密码,并使用Firebase身份验证作为后端。我使用像素2作为模拟器。每次应用程序处理登录功能时,它都会崩溃。 下面是Java文件和gradle文件 Java文件:

  • 当使用Firebase身份验证匿名帐户时,它偶尔会在系统中创建一个新的用户ID,有时它会使用相同的用户ID。我真的希望每次都能创建相同的用户ID,这样匿名用户仍然可以在应用程序中维护相同的进度/数据。这实际上是我开始使用Firebase的原因。即使在重新启动应用程序等之后,我如何始终维护一个匿名帐户来保持相同的用户ID? 我希望用户每次以访客身份玩游戏时都能获得相同的ID。我看到有些应用程序在卸载

  • 首先,我很抱歉在这里问这样的问题,但是如果您以前从未参与过symfony项目,symfony文档不会提供太多完整的示例。 因此,我已经安装了symfony/security包,并且在本教程中开始了类似的工作https://symfony.com/doc/current/security/form_login_setup.html 包裹/security.yaml 登录路径和检查路径是我的安全控制器