Rails:验证多个控制器上的正确用户

时间:2011-11-23 19:32:52

标签: ruby-on-rails user-controls refactoring controller

我有几个控制器需要正确的用户进行编辑/更新/删除操作。什么是Rails-完成以下任务的方式:

目前,在每个控制器中我都有以下代码:

class FooController < ApplicationController
  before_filter :correct_user, :only => [:edit, :update, :destroy]

  # normal controller code

  private

  def correct_user
    @foo = Foo.find params[:id]
    redirect_to some_path unless current_user == @foo.user
  end
end

我在3个控制器中有类似的代码。我开始把它带给这样的帮手:

module ApplicationHelper
  def correct_user( object, path )
    if object.respond_to? :user
      redirect_to path unless object.user == current_user
  end
end

但我想知道这是否是一个很好的方法。解决这个问题的方法是什么?

谢谢

修改

这里正确的用户检查是因为我想确保只有作者可以对每个对象进行编辑/删除。

为了澄清,对象将是问题和帖子。我不想使用像CanCan这样的东西,因为这样的东西太过分了。

2 个答案:

答案 0 :(得分:2)

我非常喜欢使用RyanB的CanCan,它允许您根据用户限制对操作的访问,并将此类授权集中到基本上单个文件中。

修改

没问题。我在CanCan上听到了你 - 它需要一段时间才能启动并运行它,但它的设计目的正是你所要求的 - 每个对象授权。

<强>替代: 另一种方法是将authoriship / current_user检查移动到ApplicationController类,所有其他控制器都从该类继承(因此它们将通过继承获取该代码 - 并且您不需要编写相同的代码在多个控制器中),它看起来像......

class ApplicationController < ActionController::Base
  ...

  helper_method :correct_user

  private
    def correct_user( object, path )
      redirect_to path unless object.user == current_user
    end

end

答案 1 :(得分:0)

您应该执行以下操作:

def edit
  @foo = current_user.foos.find(params[:id])
end

这样,只有当前用户是Foo的所有者时,他才能看到它。