Rails 3 - authenticate和:before_filter

时间:2011-10-12 17:11:17

标签: ruby-on-rails-3 session authentication before-filter

我是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分钟闲置=&gt;会话将过期=&gt;我应该重定向到登录表单。但问题出在这里 - 我闲置了15分钟,我刷新了这个页面,所以我仍然在行动 template_for_login_user - 这就是问题......

我想问你 - 请你帮帮我,哪里可能有问题?我做错了什么?

1 个答案:

答案 0 :(得分:5)

在ApplicationController中,您是否添加了这样的行:

before_filter :check_session

如果某些控制器操作不需要对用户进行身份验证,则可以添加以下内容:

skip_before_filter :check_session, :only=> [:index, :search, etc..]

在这个例子中,这将跳过你的before_filter:check_session on action:index和search。这样,您将拥有一个全局行为,始终检查登录用户的会话。但是您可以在特定控制器中跳过此操作,其中某些操作不需要用户进行身份验证