在Ruby on Rails 3中使用自定义控制器的任何操作之外的current_user

时间:2014-07-07 16:53:20

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

我必须构建只有注册用户才能访问的网站。作为一名经验不足的RoR开发人员,我尝试设置Railscasts episode #250中描述的身份验证系统,并计划使用Cancan作为授权系统。使用Cancan check_authorization 时,我遇到了 current_user 变量的问题,这是在 application_controller.rb 中的私有帮助器方法中定义的:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

看起来它在每个其他控制器中的cancan check_authorization 方法都是不可见的,因为它被置于任何操作之外(谢谢调试器gem)。
现在任何用户(无论他是否登录)都可以访问登录和注册页面(OK),但是每个人都无法访问我已经定义的控制器 check_authorization 中的任何其他操作(并且此方法必须存在于所有这些)(不行)
问题是:使用rails约定解决此问题的最佳方法是什么?

替代方案是对每个操作使用cancan authorize!方法,但它看起来不正确。此外,当我使用devise gem时,没有像这样的问题,但对我而言,使用这种身份验证系统对于像我这样的轻型项目而言过于沉重。

2 个答案:

答案 0 :(得分:1)

根据您的问题我认为您想要使用您在应用程序控制器中定义的current_user方法授权控制器中的某些操作(如果我错了,请更正我)。您可以做的是使用before filter并在控制器中定义一个私有方法,以检查当前用户是否存在,如果它不是,那么只需重定向到根页

class UserController < ApplicationController
  before_action :authenticate, except: [:index, :show] #list your actions in except array where you don't want to check for current user

  private

  def authenticate
    redirect_to your_path, notice: "You must login first" if !current_user  # if current user doesn't exist it will redirect to your path with notice
  end
end

答案 1 :(得分:0)

在您的控制器中使用before_filter,如下所示:

before_filter :current_user

这将在控制器中的每个操作之前运行该方法。如果需要,您可以添加:only:except以包含或排除某些方法。