Пользовательский модуль входа JBoss JAAS Сообщения об ошибках - PullRequest
6 голосов
/ 18 августа 2011

У меня есть приложение, которое использует пользовательский модуль входа в систему JBoss.Аутентификация может быть неудачной по целому ряду причин, и мне приходится отображать их пользователю вместо обычной Inavlid username / password ошибки.

Есть ли способ получить сообщение об ошибке из сообщения для входа?Я думаю, что лучше всего было бы через исключение, поскольку authenticate возвращает логическое значение, однако я не могу понять, как его перехватить после аутентификации.Любые указатели приветствуются.

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

Использовал клапан org.jboss.web.tomcat.security.ExtendedFormAuthenticator и схватил j_exception с сессии.

Ссылка:

  1. http://books.zkoss.org/wiki/Small_Talks/2009/August/Form_Based_Login_with_JAAS_on_JBoss_and_ZK
  2. http://community.jboss.org/wiki/ExtendedFormAuthenticator
2 голосов
/ 19 июня 2013

Вы можете использовать модуль входа в базу данных, а затем получить исключение, используя

Исключение e = (Исключение) SecurityContextAssociation.getContextInfo ("org.jboss.security.exception");

Вы можете использовать этот код внутри функции управляемого компонента для получения сообщения об ошибке, например.

public String getLoginFailureMsg(){
        Exception e =  (Exception) SecurityContextAssociation.
                                     getContextInfo("org.jboss.security.exception");
        if(e != null){
            if(e.getMessage().contains("PB00019"))
                return "invalid username";
            else
                return "invalid password";
        }
        return null;
    }

для настройки JAAS с Jboss 7, смотрите этот удар:

http://amatya.net/blog/implementing-security-with-jaas-in-jboss-as-7/

1 голос
/ 15 июля 2016

У меня была такая же проблема ..., но я не люблю писать код, привязанный к контейнеру по понятным причинам.

Итак, я сам добавил исключение к сеансу.

Сначала создайте держатель исключения ThreadLocal, чтобы отправить исключение между LoginContext и ServletContext:

public final class SecurityThreadLocal {
 private static final ThreadLocal<Exception> j_exception = new ThreadLocal<Exception>();

 public static void setException(Exception e) {
   j_exception.set(e);
 }

 public static Exception getException() {
   return (Exception)j_exception.get();
 }

 public static void clear() {
   j_exception.remove();
 }

}

Добавить LoginException в SecurityThreadLocal:

    catch (Exception e) { // or just catch LoginException
      log.log(Level.SEVERE, e.getMessage(), e);
      SecurityThreadLocal.setException(e);
    }

Добавление исключения в сеанс Http с фильтром:

web.xml

  <filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

SecurityFilter.java

  if (uri.endsWith("<form-error-page>") && session != null){
    Exception j_exception = SecurityThreadLocal.getException();
    if( j_exception != null)
      session.setAttribute("j_exception", j_exception);
  }

Но вы должны знать, поскольку я знаю, что это плохая практика и взлом безопасности.

Ну, в моем случае клиент выиграл ...

...