【问题标题】:Roles and Permissions model in database数据库中的角色和权限模型
【发布时间】:2013-07-07 10:40:17
【问题描述】:

我的项目中有一个用户模型和许多其他模型,以创建一个我实现角色和权限的 RBAC 系统。用户has_and_belongs_to_many 角色和角色has_and_belongs_to_many 权限。

class Permission
  include Mongoid::Document
  field :ability, type: String

  has_and_belongs_to_many :roles
  belongs_to :permission_for, polymorphic: true, dependent: :destroy

  index({ability: 1,permission_for_id: 1},unique: true)
end

class Role
  include Mongoid::Document

  field :name, type: String

  has_and_belongs_to_many :permissions
  has_and_belongs_to_many :users
  belongs_to :role_for, polymorphic: true

  index({name: 1,role_for_id: 1},unique: true)
end

在用户模型中我有:

Class User
  include Mongoid::Document
  .
  .
  .
  def able?(scope,model,action)
    # There must be something to load and check permissions
  end
end

在作用域 (role_for) 中定义的角色和在角色作用域中的模型中定义的权限(项目是作用域,任务是该作用域中的模型)permission_for

在用户模型中,我需要从数据库中获取数据并检查用户是否能够执行该操作,在大量数据中需要太长时间。 able? 我实现的函数很简单,就是加载每个用户的角色和每个角色的权限,然后检查权限的能力是否等于动作,然后返回true或false!

是否有任何 gem 或代码可以做类似的事情?如果没有,您能否告诉我如何以这种方式实现角色和权限,同时减少数据库负载?

很多东西

编辑 1

好的,我已经创建了这个关系并设法在我的模型中使用它,正常使用的性能还可以,但是当我想要获取大量数据时,它非常慢。我需要在作用域模型中缓存角色和权限,我该怎么做?是否有任何 Rails 插件可以为我做到这一点?

【问题讨论】:

    标签: ruby-on-rails-3 caching rbac role-based russian-doll-caching


    【解决方案1】:

    我们的产品已接近软启动,我实施了该解决方案,但稍作调整:

    我是如何完成 RBAC 的:

    项目 权限 ---> 任务 ^ (能力) | | 五 用户(能够?)

    此架构是最终实现的非常简化的版本,但概念相同

    User.able?(model,ability) 返回真,如果与模型相关的用户相关角色的所有权限联合具有能力权限。

    权限>>查看编辑删除 V 角色-------------------------------- 1 真假假 2 真真假 3假真假 -------------------------------- 结果真真假

    如果用户有角色 1,2,3 那么用户可以view,edit 但不能delete

    为了解决性能问题和数据库命中使用俄罗斯娃娃缓存,我为每个角色缓存权限的哈希表示:

     role.get_permissions
     # returns {modelID => ['view'], model2ID => ['view','edit']}
    

    然后为用户合并所有这些哈希值并再次缓存新的哈希值。

    在每次调用 User 类的 able? 方法时,我都会获得该哈希(从缓存中,或者如果更改,则从数据库中生成新的)和 Job Done :)

    这种缓存最糟糕的问题是缓存过期。所以我们决定为我们的 ORM (MongoID) 添加新功能

    从角色添加或删除权限将更新角色模型中的属性(不更新其时间戳)

    对于添加/删除/编辑角色的角色用户,我们这样做以及项目角色关系。

    但是对于任务权限我们什么都没做,因为权限永远不会改变(能力和 ID 很重要)。

    对于角色权限关系更新不会触发角色的 update_permission。

    希望对达到这一点的任何人都有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多