Я использую OpenID. То, как я делаю его так, чтобы пользователь остался, входило в систему в течение долгого времени даже после закрытия окна браузера?
Как я храню и получаю доступ к пользователю User
объект?
В основном я предполагаю, что просто действительно не понимаю, как сессии работают в Java.
Значит, вам действительно нужен вариант «Запомнить меня на этом компьютере»? На самом деле это не связано с частью OpenID. Вот способ сделать это независимо от языка:
Сначала создайте таблицу БД, содержащую как минимум cookie_id
и user_id
столбцов. При необходимости также добавьте cookie_ttl
и ip_lock
. Думаю, названия столбцов говорят сами за себя.
При первом входе в систему (при необходимости только с установленной опцией «Запомнить меня») генерирует длинный, уникальный, трудно угадываемый ключ (который находится в никоим образом , относящийся к пользователю), который представляет cookie_id
и сохраняет его в БД вместе с user_id
. Сохраните cookie_id
как значение cookie для файла cookie с известным именем, например помните
. Дайте cookie долгий срок службы, например один год.
При каждом запросе проверять, вошел ли пользователь в систему.Если нет, то проверьте значение cookie cookie_id
, связанное с именем cookie запомнить
. Если он есть и действителен в соответствии с базой данных, то автоматически войдите в систему пользователя, связанного с user_id
, и снова отложите срок хранения файлов cookie и, если есть, также cookie_ttl
в базе данных.
В терминах Java / JSP / Servlet используйте HttpServletResponse # addCookie ()
для добавления cookie и HttpServletRequest # getCookies ()
для получения файлов cookie. Вы можете выполнить всю первоначальную проверку в фильтре
, который прослушивает нужные ресурсы, например / *
или может быть немного более ограниченным.
Что касается сессий, то здесь это вам не нужно. Его срок службы короче, чем вам нужно. Используйте его только для того, чтобы поместить вошедшего в систему пользователя или «найденного» пользователя, если у него есть действительный запомнить
cookie. Таким образом, фильтр
может просто проверять свое присутствие в сеансе, а затем не нужно проверять файлы cookie каждый раз.
В конце концов, все довольно просто. Удачи.
Ну, исходная причина, по которой я выбрал OpenID, заключалась в том, чтобы кто-то другой мог взять на себя большую часть реализации и безопасности аутентификации для меня.
После более подробного изучения OpenID выяснилось, что есть нечто, называемое «Немедленный запрос» ( http://openid.net/specs/openid-authentication-2_0.html#anchor28 ).
При запросе аутентификации Проверяющая сторона МОЖЕТ запросить, чтобы OP не взаимодействовал с конечным пользователем. В этом случае OP ДОЛЖЕН немедленно ответить либо с утверждением, что аутентификация прошла успешно, либо с ответом, указывающим, что запрос не может быть выполнен без дальнейшего взаимодействия с пользователем.
Из-за этого я думаю, что мог бы просто сохранить URL-адрес openID пользователя в cookie и использовать немедленный запрос, чтобы узнать, аутентифицирован ли пользователь или нет. Таким образом, мне не нужно ничего делать с моей базой данных или реализовывать какую-либо логику для предотвращения перехвата сеанса долгоживущего cookie.
Похоже, что OpenID предлагает сделать это в своем документе Relying Party Best Practices .