Как проверить логин / аутентификацию с помощью Arquillian-Java EE 7

У нас есть приложение Java EE 7 и использовать Arquillian для тестирования материала. Теперь мы хотим проверить некоторые разрешения текущего зарегистрированного пользователя. Мой вопрос довольно прост, как войти в систему пользователя, когда внутри testcase? Я читал ProgrammaticLogin не работает в arquillian тесты и встраиваемых приложений GlassFish, безопасности и Arquillian вопросы но на них нет четкого ответа. Мой нынешний подход примерно таков:--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? Это по умолчанию ценность? (не удалось найти никаких спецификаций здесь)

1 ответов


Arquillian не предоставляет никакой поддержки для определения областей. Вместо этого вам нужно настроить область в контейнере самостоятельно. Это несколько сложно при использовании встроенного контейнера Glassfish, но это выполнимо.

Я предполагаю, что secureJDBCRealm является пользовательской областью, а не одной из стандартных/встроенных областей Glassfish. Чтобы настроить пользовательскую область во встроенном контейнере Glassfish, вам необходимо:

  1. место login.conf файл на тесте путь класса, который ссылается на область. Для этого добавьте в каталог config в каталог ресурсов и места login.conf внутри этой директории. Ваш login.conf будет выглядеть примерно так

    secureJDBCRealm {
       com.blah.blah.LoginModule required;
    };
    
  2. ваша пользовательская область вместе с любыми зависимостями должна быть на пути тестового класса.

  3. вам нужно программно создать область в glassfish. Это можно сделать через org.в GlassFish.встраиваемый.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();
    }