Как проверить вход/аутентификацию с помощью Arquillian — 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, утверждая, что у меня нет LoginModule, настроенного для «fileRealm». Но «fileRealm» — это не та область, которую я ищу (в первый раз я поместил ее туда для проверки, но затем изменил ее на «secureJDBCRealm», которая является нашей пользовательской областью безопасности для GlassFish). Мы используем arquillian-glassfish-embedded-3.1 для тестирования.

  • Кто-нибудь знает, где определить Realm для Arquillian?
  • Почему мое приложение продолжает искать fileRealm? Это значение по умолчанию? (здесь характеристики не нашел)

person bmurauer    schedule 09.10.2013    source источник


Ответы (1)


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();
    }
    
person lucasweb    schedule 05.12.2013
comment
Спасибо! Однако в итоге мы использовали удаленный GlassFish с уже предварительно настроенным правильным Realm. Удаленная поддержка появилась не так давно, поэтому сначала мы не видели такой возможности. - person bmurauer; 06.12.2013
comment
Изменился интерфейс CommanderRunner, и он больше не работает :-/ Glassfish 3.1.2.2 - person Martin Nuc; 17.04.2014