Использование HTTP Request.login с JBoss / JAAS

Я успешно установил домен безопасности JBoss и могу пройти аутентификацию с использованием аутентификации BASIC (как определено в web.xml). Все это хорошо работает. Однако я не могу понять, как использовать метод http request.login.

Следующий домен безопасности (из jboss-web.xml) работает для аутентификации BASIC:

<jboss-web>  
    <context-root>/myapp</context-root>  
    <security-domain>java:/jaas/myapp-realm</security-domain>  
</jboss-web> 

Но когда я использую request.login следующим образом:

public void login() {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
    try {
        request.login(username, password);
    }
    catch (ServletException ex) {
        java.util.logging.Logger.getLogger(UserLogin.class.getName()).log(Level.SEVERE, null, ex);
    }
}

У меня следующее исключение:

javax.servlet.ServletException: Failed to authenticate a principal

Я знаю, что имя пользователя / пароль в порядке (он отлично работал с BASIC auth). Я вошел в систему на уровне TRACE, и не похоже, что он даже пытается аутентифицироваться. Что я пропустил?

См. http://java-web-development.blogspot.com/2011/07/jee-6-security-part-two-implementation.html, если вам нужны дополнительные сведения о моей настройке / конфигурации. Я использую JBoss 6.


person Simon    schedule 05.07.2011    source источник


Ответы (1)


Сейчас работает. Я убедился, что аутентификация на основе FORM работает, и как только это сработало, я вернулся к использованию request.login, и это сработало ?! Я использую горячее развертывание через JRebel, поэтому, возможно, я прошел аутентификацию с помощью BASIC auth, и он оставил участника-пользователя в моем сеансе, что затем привело к сбою request.login (request.login выдает исключение, если вы уже аутентифицированы). Клянусь, я выполнил жесткий перезапуск JBoss, но это единственная логическая вещь, о которой я могу думать.

Теперь у меня есть проверка работоспособности вокруг входа в систему, например:

public void login() {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
    try {
        Principal userPrincipal = request.getUserPrincipal();
        if (request.getUserPrincipal() != null) {
            request.logout();
        }
        request.login(username, password);
        userPrincipal = request.getUserPrincipal();
        authUser = userDao.findByLogin(userPrincipal.getName());
    }
    catch (ServletException ex) {
        java.util.logging.Logger.getLogger(UserLogin.class.getName()).log(Level.SEVERE, null, ex);
    }
person Simon    schedule 08.07.2011