Обновите JSESSIONID после успешного входа - PullRequest
0 голосов
/ 24 января 2019

Я хочу, чтобы при правильной регистрации пользователя идентификатор JSESSIONID менялся.

У меня есть свой собственный Hook для работы с autologin с библиотекой AutologinTokenClient (first_hook) и еще один Hook для проверки того, является ли пользователь администратором, перенаправьте его на панель администрирования (second_hook).

Моя конфигурация:

JBOSS: jboss-eap-6.4
Liferay Portal Enterprise Edition 6.2.10 EE GA1

Я попытался добавить тег в login.jsp, который я изменил в первом хуке (first_hook). Но это всегда один и тот же идентификатор.

<% @ page session = "false"%>

В first_hook у меня есть класс postlogin с некоторыми методами, я пытался поставить следующую функцию, но каждый раз, когда я выполняю ее, я выхожу из сеанса и мне приходится заново входить в систему.

private void renewSessionID (HttpServletRequest request)
{
    LOG.info ("--------------------------------------------------------------------");
    HttpSession oldSession = request.getSession (true);
    LOG.info("OLD_SESSION: "+oldSession.getId ());

    Enumeration attrNames = oldSession.getAttributeNames ();
    Properties props = new Properties ();

    if (attrNames != null)
    {
        while (attrNames.hasMoreElements ())
        {
            String key = (String) attrNames.nextElement ();
            props.put (key, oldSession.getAttribute (key));
        }

        // Invalidating previous session
        oldSession.invalidate ();
        // Generate new session
        HttpSession newSession = request.getSession (true);
        attrNames = props.keys ();

        while (attrNames.hasMoreElements ())
        {
            String key = (String) attrNames.nextElement ();
            newSession.setAttribute (key, props.get (key));
        }

        LOG.info ("NEW_SESSION: "+newSession.getId ());
    }
}

И ошибка следующая:

Caused by: java.lang.IllegalStateException: JBWEB000043: Can not create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession (Request.java:2649)
at org.apache.catalina.connector.Request.getSession (Request.java:2382)

Я также пытался отдельно добавить следующие строки текста в файл portal-ext.properties, но это ничего не меняет:

session.enable.phishing.protection = true
session.phishing.protected.attributes = CAS_LOGIN, HTTPS_INITIAL, LAST_PATH, OPEN_ID_CONNECT_SESSION

Есть идеи?

1 Ответ

0 голосов
/ 11 февраля 2019

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

session.enable.phishing.protection = true

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

О собственной реализации этой функции:

Javadocs для запроса # getSession:

Возвращает текущую HttpSession, связанную с этим запросомили, если текущий сеанс отсутствует, а create - true, возвращает новый сеанс.

Если create - false, а в запросе отсутствует действительный HttpSession, этот метод возвращает значение null.

Чтобы убедиться, чтосеанс поддерживается должным образом, вы должны вызвать этот метод, прежде чем ответ будет зафиксирован.Если контейнер использует куки-файлы для поддержания целостности сеанса и ему предлагается создать новый сеанс после подтверждения ответа, генерируется исключение IllegalStateException.

...