Ruby on rails 3 数据库中的角色和权限模型

Ruby on rails 3 数据库中的角色和权限模型,ruby-on-rails-3,caching,rbac,role-based,russian-doll-caching,Ruby On Rails 3,Caching,Rbac,Role Based,Russian Doll Caching,我的项目中有一个用户模型和许多其他模型,为了创建一个RBAC系统,我实现了角色和权限。用户拥有且属于多个角色,而角色拥有且属于多个权限 class Permission include Mongoid::Document field :ability, type: String has_and_belongs_to_many :roles belongs_to :permission_for, polymorphic: true, dependent: :destroy

我的项目中有一个用户模型和许多其他模型,为了创建一个RBAC系统,我实现了角色和权限。用户
拥有且属于多个
角色,而角色
拥有且属于多个
权限

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\u,用于
)和在角色作用域中的模型中定义的权限(项目是该作用域中的作用域,任务是该作用域中的模型),以及对的
权限

在用户模型中,我需要从数据库中获取数据,并检查用户是否能够执行该操作,因为在大量数据中,这需要花费太长时间<代码>能够?
我实现的函数很简单,它只需加载每个用户的角色和每个角色的权限,然后检查权限的能力是否等于操作,然后返回true或false

有没有什么gem或代码可以这样做?如果没有,您能告诉我如何以这种方式实现角色和权限,同时大大减少数据库负载吗

许多塔恩克人

编辑1


好的,我已经创建了这个关系,并设法在我的模型中使用它,正常使用时的性能是可以的,但是当我想要获取大量数据时,它非常慢。我需要在范围模型中缓存角色和权限,我如何才能做到这一点?有什么rails插件可以帮我做到这一点吗?

我们的产品即将软发布,我实现了该解决方案,但做了一些小调整:

我是如何完成RBAC的: 如果用户有角色1,2,3,则用户可以
查看
编辑
,但不能
删除

为了解决性能问题和数据库命中率问题,请对每个角色I缓存权限的哈希表示:

 role.get_permissions
 # returns {modelID => ['view'], model2ID => ['view','edit']}
然后为用户合并所有这些散列,并再次缓存新的散列

在用户类的
able?
方法的每次调用中,我都会得到该散列(从缓存中,或者如果已更改,则从数据库中生成新的),并且作业已完成:)

这种缓存最糟糕的问题是缓存过期。因此,我们决定在ORM(MongoID)中添加新功能

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

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

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

对于角色权限关系更新不会触发对角色的更新\u权限


希望这对任何人都有帮助。

我们的产品即将软发布,我实现了该解决方案,但有一些小改动:

我是如何完成RBAC的: 如果用户有角色1,2,3,则用户可以
查看
编辑
,但不能
删除

为了解决性能问题和数据库命中率问题,请对每个角色I缓存权限的哈希表示:

 role.get_permissions
 # returns {modelID => ['view'], model2ID => ['view','edit']}
然后为用户合并所有这些散列,并再次缓存新的散列

在用户类的
able?
方法的每次调用中,我都会得到该散列(从缓存中,或者如果已更改,则从数据库中生成新的),并且作业已完成:)

这种缓存最糟糕的问题是缓存过期。因此,我们决定在ORM(MongoID)中添加新功能

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

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

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

对于角色权限关系更新不会触发对角色的更新\u权限

希望这能帮助任何人达到这一点

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