Rails 3.1中的授权:CanCan,CanTango,declarative_authorization?

Raj*_*ani 7 ruby-on-rails rails-authorization ruby-on-rails-3

我查看了declarative_authorization,CanCan和CanTango.他们都善于为应用程序添加授权,但我想知道如何将授权添加到模型的特定实例,即一个人可以在一个项目中拥有管理访问权限并且仅限于(读取少于管理:有限更新等)在另一个.

你能用更好的方式吗?如果我的问题听起来太微不足道,请道歉.可能是因为我是RoR的新手.

谢谢,约翰

pdu*_*ler 4

据我了解 CanCan 和 declarative_authorization,并且我使用这两者实现了基于角色的授权,因此我推荐 CanCan。只是我的两分钱。

示例(未经测试,不幸的是我无法在这里测试并且我无法访问我的代码)

假设我们有这样的结构:

class User < ActiveRecord::Base
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :users

  # attributes: project_read, project_create, project_update
end
Run Code Online (Sandbox Code Playgroud)

那么,CanCan 可能看起来像这样:

class Ability
  include CanCan::Ability

  def initialize(user)
    @user = user
    @role = user.role

    # user can see a project if he has project_read => true in his role
    can :read, Project if role.project_read? 

    # same, but with create
    can :create, Project if role.project_create?

    # can do everything with projects if he is an admin
    can :manage, Project if user.admin?
  end

end
Run Code Online (Sandbox Code Playgroud)

您可以在 github 上的 CanCan wiki 中找到所需的所有信息。个人推荐阅读:

基本上,您只需要扩展上面的示例即可通过您的关系包含您的角色。为了简单起见,您还可以在ability.rb.

您可能会犯的主要警告(至少我是这样):在定义用户不能做的事情之前,确保您的用户可以对模型做一些事情。否则你会沮丧地坐在那里思考“但是为什么?我从来没有写过用户不能。”。是的。但你也从未明确写过他可以......