Обработка ошибок аутентификации Java EE - PullRequest
2 голосов
/ 20 января 2009

В настоящее время мы пытаемся реализовать веб-приложение, использующее механизм аутентификации Java EE с помощью входа в систему на основе FORM, внутри веб-контейнера Websphere 6.1. Если аутентификация прошла успешно, у нас все работает; группы членства LDAP извлекаются, выполняется сопоставление группы и роли, а роли возвращаются и правильно интерпретируются веб-приложением.

Если аутентификация не прошла успешно, возвращается страница form-login-error. Тем не менее, это статическая страница, которая просто говорит что-то вроде «произошла ошибка». Как мы улавливаем конкретную ошибку, которая помешала успешному входу в систему (неверное имя пользователя / пароль, хранилище LDAP недоступно, учетная запись заблокирована, срок действия пароля истек и т. Д.)? Похоже, что должен быть какой-то простой способ сделать это, так как вы хотите относиться к некоторым исключениям «безопасности» иначе, чем к другим.

Ответы [ 4 ]

1 голос
/ 26 января 2009

Я использую Struts, поэтому он сделает пересылку для вас. Если у вас нет фреймворка (почему бы и нет?), Вам придется сделать это вручную.

Спецификация Java EE охватывает сервлет j_security_check.

Страница входа отправляет j_username и j_password в сервлет j_security_check. Ваше приложение будет настроено на ошибку на несанкционированной странице (см. Web.xml), но (первоначально) будет вызывать сервлет. 401 или 403 перейдут на запрещенную страницу (снова web.xml)

Внутри этого сервлета (который расширяет HttpServlet) - вы проверите все эти хорошие вещи.

public final void doGet(javax.servlet.http.HttpServletRequest request,
    javax.servlet.http.HttpServletResponse response)
    throws javax.servlet.ServletException, java.io.IOException
{
    // initialize the app
    AppInit initializer = new AppInit();

    // get the logger
    log = new Log4jWrapper(this.getClass());

    // initialize the application session
    HttpSession sess = request.getSession(true);
    sess.setAttribute(CommonConstants.SESSION_CURR_USER_ID, request.getRemoteUser());

    // initialize the JSP to forward to based on the user role
    String fwdJSP = "SetupMainPage.jsp";
    if (request.isUserInRole(CommonConstants.ROLE_MANAGER)) {
        log.debug("User is a Manager");
    }
    //else other role checks - (these are users in groups in the LDAP)
    // initialize the application session and set a variable to indicate that
    // we are coming from a first time login (not a timeout login)
    sess.setAttribute(CommonConstants.SESSION_COMING_FROM_INITIAL_LOGIN,"TRUE");
    disp = getServletContext().getRequestDispatcher("SetupMainPage.jsp");
    disp.forward(request, response);
}
//else failure

Неизвестный пользователь

[22.11.08 8: 54: 47: 993 EST] 7f6ac69c FormLoginServ E SECJ0118E: Ошибка аутентификации во время аутентификации для пользователя s

правильный пользователь - неправильный пароль, но request.getRemoteUser () будет иметь значение

[22.11.08 8: 56: 45: 082 EST] 7f51469c FormLoginServ E SECJ0118E: Ошибка аутентификации во время аутентификации для пользователя jbsymolo

К сожалению - у меня нет примеров того, как кто-то заблокирован, но я собираюсь предположить, что для главного каталога безопасности (LDAP) у вас будет запись для пользователя.

Это от кого-то другого (поэтому я не могу взять кредит)

Мне кажется, на этой странице описано, как делать то, что вы хотите.

В частности, как извлечь исключение аутентификации из произвольного базового источника аутентификации (похоже, что Websphere называет их реестрами пользователей).

Throwable t = com.ibm.websphere.security.auth.WSSubject.getRootLoginException ();
if (t! = null)
t = определить причину (t);

Где defineCause () определено на той же странице. Таким образом, даже если ваш сервер настроен для аутентификации на тракторе John Deer, у вас будет доступ к «OutOfGasLoginException», если он есть. Приведенный выше код может идти в Servlet, Servlet Filter или JSP, который перенаправляется контейнером (как описано выше jsymolon). Он просто анализирует исключения и затем помещает соответствующее понятное сообщение об ошибке на полученную страницу.

0 голосов
/ 26 октября 2011

Спецификация JavaEE не предоставляет стандартного средства для получения обратной связи аутентификации, такой как коды ошибок.

Согласно следующему IBM Redpaper об интеграции безопасности z / OS в сером примечании на стр. 57: доступно специальное расширение IBM, так что на странице ошибок JSP может сообщать о конкретном сообщении (например, срок действия пароля истек) на основе на код ошибки.

Согласно WebSphere InfoCenter образец FormLoginWeb из пакета TechSamp в вашей установке WebSphere (samples/src/TechSamp/FormLoginWeb) должен демонстрировать такое специфичное для IBM расширение но ... Единственная интересная вещь - это LoginFilter, который перехватывает вызовы на /j_security_check и способен выполнять проверку перед входом в систему и действие после входа в систему, как объяснено в подробностях в этом документе .

С таким механизмом можно получить исключение при входе в систему от субъекта JAAS и установить код ошибки входа в систему в HttpSession, чтобы страница ошибки могла генерировать конкретное сообщение.

0 голосов
/ 23 января 2009

Проверьте эту статью Защита приложений J2EE с помощью фильтра сервлетов . Я полагаю, что это покрывает ваше требование иметь возможность указать причину ошибки аутентификации.

0 голосов
/ 21 января 2009

Это древнее знание - я считаю, что сделал такое с котом. Насколько я помню, не было никакого стандартного способа, поскольку реализация была полностью отделена от веб-содержимого запроса и веб-интерфейса, поэтому было трудно установить какие-либо средства связи между компонентом аутентификации и веб-интерфейсом (например, страница с ошибкой). ).

Мы получили способ, специфичный для котов, в значительной степени опирающийся на текущую реализацию. Я больше не в этой компании, поэтому не могу рассказать о текущем состоянии кода или о решении, которое мы тогда выбрали. Я полагаю, что вам также понадобится какое-то конкретное решение Websphere - будь то использование локальных переменных потока, ввод сообщений с именем пользователя, которые пытались войти в систему, каким-то образом получить идентификатор сеанса или подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...