Как заставить пользователя регистрироваться на моем сайте в течение нескольких месяцев?

Я использую OpenID. Как я могу сделать это так, чтобы пользователь долгое время регистрировался даже после закрытия окна браузера?

Как сохранить и получить доступ к объекту User пользователя?

В принципе, я думаю, я просто не понимаю, как работают сессии в Java.

Ответ 1

Итак, вы действительно хотите, как вариант "Запомнить меня на этом компьютере"? Это фактически не связано с частью OpenID. Здесь язык-агностический способ, как вы можете это сделать:

  • Сначала создайте таблицу БД с столбцами не менее cookie_id и user_id. При необходимости также добавьте cookie_ttl и ip_lock. Названия столбцов говорят сами за себя, я думаю.

  • При первом входе в систему (если необходимо только с опцией "Запомнить меня" ), сгенерируйте длинный, уникальный, труднодоступный ключ (что никоим образом связанный с пользователем), который представляет cookie_id и сохраняет это в БД вместе с user_id. Храните cookie_id в качестве значения cookie cookie с известным именем cookie, например. remember. Дайте печенью долгий срок службы, например. один год.

  • В каждом запросе проверьте, вошел ли пользователь в систему. Если нет, проверьте значение cookie cookie_id, связанное с именем файла cookie remember. Если он есть, и он действителен в соответствии с БД, затем автоматически войдите в систему пользователя, связанного с user_id, и отложите возраст печенья снова, а если есть, также cookie_ttl в БД.

В условиях Java/JSP/Servlet используйте HttpServletResponse#addCookie(), чтобы добавить файл cookie и HttpServletRequest#getCookies() для получения файлов cookie. Вы можете выполнить все первые проверки в Filter, который прослушивает нужные ресурсы, например. /* или, возможно, немного более ограниченный.

Что касается сессий, вам здесь это не нужно. Он имеет более короткий срок службы, чем вам нужно. Используйте его только для ввода зарегистрированного пользователя или "найденного" пользователя, когда он имеет действительный файл cookie remember. Таким образом, Filter может просто проверить свое присутствие в сеансе, а затем не нужно проверять файлы cookie каждый раз.

Это ведь довольно прямо. Удачи.

См. также:

Ответ 2

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

Посмотрев в OpenID больше, появляется нечто вроде "немедленного запроса" (http://openid.net/specs/openid-authentication-2_0.html#anchor28).

При запросе аутентификации доверяющая сторона МОЖЕТ запросить, чтобы OP не взаимодействовал с конечным пользователем. В этом случае OP ДОЛЖЕН немедленно ответить либо утверждением, что проверка подлинности успешна, либо ответом, указывающим, что запрос не может быть выполнен без дополнительного взаимодействия с пользователем.

Из-за этого я думаю, что могу просто сохранить URL-адрес пользователя openID в файле cookie и использовать немедленный запрос, чтобы проверить, не аутентифицирован ли пользователь. Таким образом, мне не нужно ничего делать с моей базой данных или реализовать любую логику для предотвращения захвата сессии долгоживущего файла cookie.

Этот способ делать это, по-видимому, таким образом, как OpenID предлагает сделать это с помощью своего документа, подтверждающего лучшую практику.