【问题标题】:Rails permissions: different types of permissions to different modelsRails 权限:不同模型的不同类型权限
【发布时间】:2012-11-02 15:39:56
【问题描述】:

我正在重写一些 Rails 3 应用程序逻辑,我想就我的 DB 建模请你动脑筋。

在我的应用中,用户可以访问页面、组和图片。作为多态关联,这很容易做到:

class Permission < ActiveRecord::Base
  belongs_to :resource, :polymorphic => true 
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :permissions
end

class Page < ActiveRecord::Base
  has_many :permissions, :as => :resource
end

# the same for Page and Picture

但是,这些权限也需要有不同的类型,例如 AdminPermission、CollaboratorPermission、OwnerPermission。我该怎么做呢?我希望能够做到这一点:

p = Page.first
u = User.first
u.admin_permissions.create(:resource => p) 

# should return AdminPermission class, not just Permission
per = User.first.permissions.first 
# should return Page
per.resource

我的问题是:我该如何建模?为每个对象创建一个 Permission 类,而不是在一个类中完成所有这些会更好吗?有这样做的聪明方法吗?我不太喜欢为 Rails 使用角色/身份验证插件,因为它们依赖于用户作为特定角色。在这里,角色随着权限的变化而变化。用户可以是组的管理员,但也可以是图像的协作者。

【问题讨论】:

    标签: ruby-on-rails activerecord authorization


    【解决方案1】:

    如果您不需要滚动自己的授权,您可以查看 CanCan 和 Ryan Bates comments 了解如何为不同项目的不同用户定义不同的能力。您可以阅读它以获得完整的详细信息,但它涉及覆盖 current_ability 方法。

    # in controller
    def current_ability
      @current_ability ||= Ability.new(current_user, current_project)
    end
    
    # in Ability class
    def initialize(user, project)
      if user.admin_for_project?(project)
        can :manage, :all
      else
        can :read, :all
      end
    end
    

    【讨论】:

    • 谢谢。我研究了 CanCan,它可能会解决我的问题。但是,如果我想推出自己的产品怎么办?
    • 嗯,有几个(专业)Railscasts 讨论这个话题。但这里有另一个 link 可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2019-09-15
    • 2021-04-22
    • 2021-11-21
    相关资源
    最近更新 更多