#ruby-on-rails-3 #session #authentication #before-filter
#ruby-on-rails-3 #сессия #аутентификация #before-фильтр
Вопрос:
Я новичок в Rails. Я пытаюсь создать простую систему аутентификации, в application_controller я помещаю следующие строки:
def check_session
if session[:user]
if session[:expiry_time] < 10.minutes.ago
reset_session
flash[:warning] = 'You was logout.'
redirect_to root_url
else
session[:expiry_time] = Time.now
end
else
#... authenticate
session[:expiry_time] = Time.now
flash[:warning] = 'You was logout.'
redirect_to root_url
end
end
Моя проблема заключается в одном действии — в этом действии я проверяю, входит ли пользователь в систему или нет. И если пользователь входит в систему, я отрисовываю один шаблон, а если нет, то я отрисовываю второй. Это выглядит так:
<% unless session[:user].nil? %>
<%= render :template => 'template_for_login_user' %>
<% else %>
<%= render :template => 'template_for_not_login_user' %>
<% end %>
И вот в чем проблема — у меня это не работает. По крайней мере… ну, если я не войду в систему, то будет отображаться шаблон template_for_not_login_user, а если да, то template_for_login_user. Это правильно.
Но если я вхожу в систему и нахожусь в template_for_login_user, но я 15 минут простаиваю => срок действия сеанса истекает => Я должен перенаправить на форму входа. Но вот в чем проблема — я 15 минут простаиваю и обновляю эту страницу, поэтому я все еще нахожусь в действии template_for_login_user — и это проблема…
Я хотел бы спросить вас — не могли бы вы мне помочь, пожалуйста, где может быть проблема? Что я делаю не так?
Ответ №1:
В вашем ApplicationController вы добавили такую строку :
before_filter :check_session
если для какого-либо действия контроллера не требуется аутентификация пользователя, вы можете добавить это:
skip_before_filter :check_session, :only=> [:index, :search, etc..]
в этом примере это пропустит ваш before_filter :check_session при действии: индексировании и поиске. Таким образом, у вас есть глобальное поведение, которое всегда проверяет сеанс для пользователя, вошедшего в систему. Но вы можете пропустить это в конкретном контроллере, где для некоторых действий не требуется аутентификация пользователя
Комментарии:
1. но если я добавлю эту строку в ApplicationController , это будет означать, что при каждом действии каждого контроллера метод check_session проверяет, входит ли пользователь в систему, верно?
2. Да, на самом деле это то, что вы хотите… я думаю. Но вы также можете добавить skip_before_filter :check_session :only=> [:index,:search и т. Д.] В другом контроллере. в этом примере это пропустит ваш before_filter :check_session при действии: индексировании и поиске. Таким образом, у вас есть глобальное поведение, которое всегда проверяет сеанс для пользователя, вошедшего в систему. Но вы можете пропустить это в конкретном контроллере, где для некоторых действий не требуется аутентификация пользователя.
3. Вы забыли запятую. Это
skip_before_filter :check_session, :only [....]
. (Как опубликовано новым пользователем Джоном Адамсом, который пока не может комментировать).