Rails / Authlogic - UserSession.destroy не завершает сеанс - PullRequest
3 голосов
/ 18 декабря 2010

Мне нужна помощь по чему-то, что должно быть очень простым. Я следовал отличному учебнику по тому, как заставить Rails 3 и Authlogic работать вместе. Это та же самая базовая оболочка аутентификации, на которую ссылаются во многих местах. Но я просто не могу заставить работать функцию выхода из системы. Я провел дни, пробуя разные вещи. Так что мне нужна помощь. Может быть, это просто что-то, что я не правильно понимаю, но вот проблема:

Суть: @ user_session.destroy не завершает сеанс.

Подробнее: Я работаю над веб-службой, поэтому я взаимодействую только с запросами в формате .xml ... и для проверки использую cURL.

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

когда я делаю следующее без входа в систему, и cookie.txt пуст (или является файлом cookie другого пользователя) ->

curl -v -H "Accept: text/xml" -X GET --cookie cookies.txt http://localhost:3000/user.xml 

мой запрос отклонен (без сеанса), как ожидалось

Когда я вхожу, используя это ->

curl -v -H "Accept: text/xml" -X POST -d 'user_session[email]=eric@xyz.com&user_session[password]=secret' --cookie-jar cookies.txt http://localhost:3000/user_session.xml

Создается новый сеанс, и я могу сделать предварительный GET для моего сердца. Все работает правильно в том смысле, что при использовании файлов cookie других пользователей не работает, при отсутствии файлов cookie не работает и т. Д.

НО ... когда я выхожу ... делаю это ->

curl -v -H "Accept: text/xml" -X DELETE --cookie cookies.txt http://localhost:3000/user_session.xml

Действие UserSessionsController # destroy называется

def destroy
  @user_session = UserSession.find
  @user_session.destroy

respond_to do |format|
  format.html { redirect_to(:users, :notice => 'Goodbye!') }
  format.xml  { head :ok }
end
end

и строки в действии - @user_session = UserSession.find и @ user_session.destroy выполнены. Нет ошибок и тестирование @user_session = UserSession.find сразу после уничтожения выдает ноль, как и ожидалось

ОДНАКО ... при следующем запросе GET, если этот же файл cookie, срок действия которого должен истечь, передается в запросе, происходит тот же поиск в базе данных идентификатора этого конкретного пользователя и информация доставляется - как если бы сеанс продолжал существовать! !

Я знаю, что это основные вещи, но для полноты вот мой ApplicationController:

class ApplicationController < ActionController::Base
#protect_from_forgery
helper_method :current_user_session, :current_user

private

def current_user_session
  return @current_user_session if defined?(@current_user_session)
  @current_user_session = UserSession.find
end

def current_user
 return @current_user if defined?(@current_user)
 @current_user = current_user_session && current_user_session.record
end

def require_user
 unless current_user
  respond_to do |format|
    format.xml  { head :unauthorized }
  end
  return false
 end
end

def require_no_user
 if current_user
  respond_to do |format|
   format.xml  { head :bad_request }
  end
 return false
end
end

@ user_session = UserSession.find в current_user_session - создает пользователя, вышедшего из системы, и будет продолжать это делать ... навсегда, если будет предоставлен исходный файл cookie, созданный при входе.

Я не могу прекратить сеанс, что бы я ни пытался. Я даже углубился в отключение кеширования ActiveRecord, поскольку видел, как происходили попадания в кеш. Кеширование отключено и ничего не изменилось. Я полагаю, что это грубая ошибка понимания с моей стороны или что-то с Authlogic, я не понимаю или не работает.

Есть мысли ??

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Основываясь на превосходном ответе Заббы, я предложил решения для очистки записи сеанса при выходе из системы и (отдельно - я хотел и то, и другое) по истечении заданного времени после создания. Ответ Заббы был в порядке, я просто хотел интегрировать ответ в Authlogic.

Решения очень просты и легки. Мне просто не было понятно, как это сделать, пока я не нашел следующие два ресурса. Наверное, я не нашел их раньше, потому что не знал, что искал.

Для очистки сеанса при выходе из системы - я использовал этот ответ, и он хорошо работает.

Аутлогический и несколько сеансов для одного и того же пользователя

Для таймаута я использовал второй ответ здесь -

Ruby on rails - Authlogic: периодически проверять, действителен ли пользовательский сеанс

И, кажется, все работает отлично.

1 голос
/ 25 декабря 2010

Если вы не нашли способ обойти это - запись сеанса фактически никогда не очищается. Одним из способов добиться этого является использование задания cron для периодической очистки сеансов.

Вот ресурс, который я нашел полезным: Сессии и куки в Ruby on Rails

Существует также плагин, который можно установить для более интеллектуального управления пользовательскими сеансами (включая функцию автоматической очистки): Ограниченные сеансы

...