Ruby on rails 3 数据库中的角色和权限模型
我的项目中有一个用户模型和许多其他模型,为了创建一个RBAC系统,我实现了角色和权限。用户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
拥有且属于多个
角色,而角色拥有且属于多个
权限
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']}