如何从登录中排除某些操作?

时间:2014-01-27 03:06:45

标签: ruby-on-rails ruby-on-rails-3 authentication controller

使用Ruby 1.8.7和Rails 3.2.13,我有一个管理员“部分”,其中有一个BaseController。我想将几乎所有页面限制为仅限登录用户。非登录用户可以看到的唯一页面是登录,忘记密码等。目前我只是保留一个“开放”的控制器和操作列表,但我认为有更好的方法。

class Admin::BaseController < ApplicationController
  @@non_authorized_paths = [
    { :controller => "admin/account" , :actions => [ "login", "login_post", "logout", "forgot_password", "forgot_password_post", "reset_password", "reset_password_post" ]}
  ]

  layout "admin/layouts/admin"
  before_filter :authorized?

  def authorized?
    if (session[:user] != nil || @@non_authorized_paths.any? {|o| o[:controller] == params[:controller] && o[:actions].any? { |a| a == params[:action] } })
      return
    end

    flash[:warning] = "You should login before doing that."
    redirect_to :controller => "admin/account", :action => "login"
  end
end

基本上,如果用户已经过身份验证,或者他们正在访问的控制器/操作位于@@non_authorized_paths列表中,则不会发生重定向。

1 个答案:

答案 0 :(得分:1)

before_filter :authorized?, :except => ['login', 'login_post', 'logout', etc.]

这些操作是否在sessions_controller中?您应该能够将之前的过滤器添加到该类,让它skip_before_filter对您关注的操作。您可以使用:only:except来缩短列表。