Обновить JSESSIONID после успешного входа в систему

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

У меня есть собственный хук для работы с автологином с библиотекой AutologinTokenClient (first_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

Есть идеи?


person KikeSP    schedule 24.01.2019    source источник
comment
Вы даете нам код, о котором идет речь. Отлично. Но где в цепочке вызовов он выполняется? В фильтре? Портлет? И обратите внимание: полная HTML-страница портала состоит из множества разных JSP — только то, что одна JSP объявляет работу без сеанса, не означает, что вся страница работает без сеанса — на самом деле сеанс может быть запущен в другом месте, полностью вне кода JSP. И, наконец (но я этого не проверял), я подумал, что Liferay создает новую сессию уже тогда, когда кто-то входит в систему, копируя соответствующие атрибуты в новую сессию. Вы можете это подтвердить или опровергнуть?   -  person Olaf Kock    schedule 30.01.2019


Ответы (1)


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

session.enable.phishing.protection = true

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

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

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

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

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

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

person Victor    schedule 11.02.2019
comment
Привет. Это было первое, что я попробовал, прежде чем изменить все предыдущие, я добавил эту строку в файл portal-ext.properties и перезагрузил сервер. Но это ничего не сделало, не изменило идентификатор или изменило какие-либо параметры. И сеанс был одинаковым до и после входа в систему. - person KikeSP; 12.02.2019
comment
Вы проверили, включает ли ваш portal.properties ваш portal-ext.properties? - person Victor; 12.02.2019