通过id检查用户权限的最佳方法是什么?

时间:2012-01-05 17:13:48

标签: ruby-on-rails ruby ruby-on-rails-3 authorization

在Rails3应用程序中,我有许多带有user_id的模型 - 我这样说:它是由某个用户创建的。

像:

current_user.id #=> 1
@item.user_id #=> 1
# this item created by user with id 1

我想限制current_user访问不是他/她创建的项目。

类似的东西:

if @item.user_id == current_user.id
  #everything is fine
else
  #redirect somwhere with flash "You don't have an access here"
end

最好的方法是什么,因为我有多个模型(以及显示/编辑/销毁的控制器)和这样的user_id?

2 个答案:

答案 0 :(得分:4)

使用CanCan

有了它,您将能够以声明方式定义权限,如下所示:

can :read, Project, :user_id => user.id

后来执行这条规则:

def show
  @project = Project.find(params[:id])
  authorize! :read, @project
end

authorize!会引发异常,但您可以更加和平地办理登机手续:

<%= link_to 'Link to a project', @project if can? :read, @project %>

您可以拦截授权错误并在一个地方处理它们:

class ApplicationController < ActionController::Base
  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, :alert => exception.message
  end
end

答案 1 :(得分:0)

最简单的方法是使用Active Record的has_many

即,在控制器中,只要您加载Item,就可以说

@item = current_user.items.find(params[:id])

通过这种方式,您无需进行任何检查工作。