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

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

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

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


person Kyle    schedule 02.02.2010    source источник


Ответы (2)


Итак, вы на самом деле хотите использовать опцию «Запомнить меня на этом компьютере»? На самом деле это не связано с частью OpenID. Вот независимый от языка способ, как вы можете это сделать:

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

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

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

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

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

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

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

person BalusC    schedule 02.02.2010
comment
Спасибо, BalusC, вы знаете какой-нибудь автоматический способ реализовать все это для меня? Или большинство сайтов сами создают таблицу базы данных и логику? Я просто подумал, что это настолько распространенная вещь, что она будет встроена в библиотеку или язык или что-то в этом роде. - person Kyle; 02.02.2010
comment
Извините, никому не приходит в голову. Но это все действительно выполнимо самостоятельно. Если вы как-то застряли и/или есть вопросы, просто Ask Question здесь :) - person BalusC; 02.02.2010
comment
-1 Такой подход представляет значительный риск для безопасности. Легко перехватить или иным образом украсть файлы cookie и повторно использовать их из любого места в Интернете. По сути, это захват сессии на стероидах. - person sfussenegger; 02.02.2010
comment
@sfussenegger: Чем он отличается от обычного сервлета HttpSession (jsessionid), PHP $_SESSION (phpsessionid) и любых других конструкций сеанса, используемых другими веб-языками/фреймворками? Я просто явно сказал сгенерировать длинный, уникальный, трудно угадываемый ключ (который никоим образом не связан с пользователем). Легче захватить код, используемый для шифрования данных сеанса, и злоупотребить им (особенно если он распространяется и/или с открытым исходным кодом), чем угадать/захватить совершенно случайный ключ сеанса и злоупотребить им. Этот разозленный -1 от вас не имеет никакого смысла, но если вам от этого станет легче, будьте моим гостем :) - person BalusC; 02.02.2010
comment
@sfussenegger: я вижу, что ты здесь второй ответчик. Как ваш собственный ответ более безопасен? Вы в основном храните всю конфиденциальную информацию в файле cookie, а не в БД на стороне сервера! Зашифровано оно или нет, оно небезопасно и может затронуть всех пользователей всякий раз, когда логика кода для его шифрования украдена/раскрыта. Также вы, возможно, упустили весь смысл cookie_ttl и ip_lock, которые я упомянул в своем ответе. - person BalusC; 02.02.2010
comment
Привет, BalusC, мне было интересно, не могли бы вы просмотреть мой ответ на этот вопрос: stackoverflow.com/questions/2185951/, и дайте мне знать, если вы видите какие-то недостатки в нем? - person Kyle; 02.02.2010
comment
0 - Я пропустил cookie_ttl и ip_lock в прошлый раз, извините :) Хотя я бы не сказал, что они говорят сами за себя. Важно проверять эти два параметра каждый раз, когда пользователь аутентифицируется с помощью cookie_id (что вы не указали явно). Однако взломать распространенный алгоритм симметричного шифрования, такой как AES или Tripple-DES, как вы сказали, не проще, чем взломать ваш генератор случайных ключей. Кроме того, легче идентифицировать недопустимые значения, так как они приведут к тарабарщине после расшифровки. Незаконный cookie_id может быть просто устаревшим. - person sfussenegger; 02.02.2010
comment
@BalusC Я относительно новичок в среде веб-приложений. Вы сказали: при каждом запросе проверяйте, вошел ли пользователь в систему. Как это лучше всего достигается в веб-приложении JSP/Servlets? - person artaxerxe; 09.12.2011
comment
@BalusC: Есть ли вред от хранения идентификатора пользователя (не пароля) вместе с UUID в файле cookie? Я вижу некоторое использование этого, если оно сохранено в файле cookie. - person Rajat Gupta; 28.04.2012
comment
@BalusC: Я думаю, что я тот, кто не понимает, что означает cookie_ttl ... Не могли бы вы немного объяснить? - person Ommadawn; 06.08.2017

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

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

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

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

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

person Kyle    schedule 02.02.2010
comment
Это, безусловно, интересная альтернатива, более соответствующая идеологии OpenID. Однако я сам еще не использовал OpenID в своих веб-приложениях, но, прочитав одно и другое, я бы сказал, сделайте это, как описано в документе, на который вы ссылаетесь. - person BalusC; 02.02.2010
comment
это наверное лучший ответ - person sfussenegger; 02.02.2010