Как сохранить пользователя на моем сайте в течение нескольких месяцев? - PullRequest
17 голосов
/ 02 февраля 2010

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

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

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

Ответы [ 2 ]

33 голосов
/ 02 февраля 2010

То есть вы действительно хотите использовать опцию «Запомнить меня на этом компьютере»? Это на самом деле не связано с частью 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, а также, если таковые имеются, cookie_ttl в БД.

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

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

В конце концов, это довольно просто. Удачи.

Смотри также:

7 голосов
/ 02 февраля 2010

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

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

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

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

Похоже, именно этот метод OpenID предлагает сделать со своим документом Best Practices * проверяющей стороны .

...