2013-10-09 4 views
8

У нас есть приложение Java EE 7 и используйте Arquillian для тестирования. Теперь мы хотим проверить некоторые разрешения для текущего пользователя. Мой вопрос довольно простой, как я могу войти в систему, когда внутри тестового файла? Я прочитал ProgrammaticLogin doesnt work in arquillian tests и Embedded Glassfish, security and Arquillian questions, но на них не ясно ответил. Мой текущий подход что-то вроде этого:Как протестировать логин/аутентификацию с помощью Arquillian - Java EE 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.

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

ответ

3

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

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

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

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

  3. Вам необходимо программно создать царство в стеклянной рыбке. Это можно сделать через org.glassfish.embeddable.CommandRunner. К счастью Arquillian Embedded Контейнер делает его доступным через 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(); 
    } 
    
+0

Спасибо! Однако мы закончили тем, что использовали удаленный GlassFish с уже настроенным правилом Realm. Удаленная поддержка возникла не так давно, поэтому мы не увидели эту возможность вначале. – bmurauer

+1

Интерфейс CommanderRunner изменен, и он больше не работает: -/Glassfish 3.1.2.2 –

Смежные вопросы