Рельсы 3 — аутентификация и:before_filter

#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 [....] . (Как опубликовано новым пользователем Джоном Адамсом, который пока не может комментировать).