#ruby-on-rails #devise #authentication #sign #out
#ruby-on-rails #devise #аутентификация #подписать #выход
Вопрос:
У меня на моем RoR-сайте установлена система авторизации на основе devise, и мне нужно автоматически выводить пользователя из системы после некоторого времени бездействия. Но также у меня есть несколько страниц на моем сайте, которые были созданы для открытия в течение длительного времени (пользователь будет просто просматривать страницу, где информация обновляется с помощью ajax), и я хочу НЕ выходить из системы при открытии этой страницы.
У кого-нибудь есть идея, как это сделать? Или как сообщить Devise, что запрос ajax тоже является пользовательской активностью?
Ответ №1:
Сначала убедитесь, что у вас установлен devise 1.5.2, если нет, обновите его, на этот вопрос ушло 6 месяцев 🙂 и я надеюсь, что вы уже решили проблему.
Вы можете изменить возвращаемое значение timeout_in, когда вы находитесь на странице, на которой хотите запретить автоматический выход.
Например:
class Student < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :timeoutable
def timeout_in
if session[:auto_sign_out] then
#the normal period of signout
30.minutes
else
#very long period, to prevent sign-out
100.years
end
end
end
Затем вы можете легко добавить before_filter в ApplicationController для установки session[:auto_sign_out]
значения
вот так:
before_filter :manage_page_auto_sign_out
def manage_page_auto_sign_out
# check the params, and see if the id is the id of the specific page
if params[:id] == EXCLUDED_PAGE_ID then
session[:auto_sign_out]= false
else
session[:auto_sign_out]= true
end
end
кроме того, вы можете добавить другие условия, чтобы убедиться, что вы проверяете нужную страницу, проверяя имя контроллера страницы следующим образом:
def manage_page_auto_sign_out
# check the params, and see if the id is the id of the specific page
if controller_name == 'pages' amp;amp; params[:id] == EXCLUDED_PAGE_ID then
session[:auto_sign_out]= false
else
session[:auto_sign_out]= true
end
end
вам нужно проверить имя контроллера страницы, я надеюсь, это поможет
Комментарии:
1. Хм, это не работает, потому что вы не можете получить доступ к сеансу в классе модели (Student): неопределенная локальная переменная или метод `session’