我想做一个记录管理系统。系统将有 4 种不同的用户角色:Admin
、Viewer
、Editor
和 Reviewer
。
虽然前两个很容易使用诸如 cancan 和 声明性授权 之类的 gem 来实现,但其他两个就没那么简单了。
基本上,每个新记录都是由管理员
创建的(只有管理员可以创建新记录),并且应该有自己单独的编辑器
和审阅者
角色。也就是说,可以为用户分配不同记录上的许多不同角色,但不能为其他记录分配不同的角色,因此可以为用户分配记录 A 和 C 的 Editor
角色,但不能为记录 B 等分配。
编辑器:可以对记录进行更改,并且可以访问 Controller 中的特定方法,例如编辑等。
审阅者:将能够审阅(查看更改)对记录所做的更改并批准或提交评论并拒绝。
查看者:只能查看每条记录的最新批准版本。
是否有任何方法可以处理此类特定于记录的用户角色?
最佳答案
使用康康 gem 和 block 条件可以轻松完成此任务。阻止条件检查对实例的授权。假设您的 Record 类有一个 editors 方法,该方法返回授权编辑器的数组,则 cancan 更新记录的功能可能如下所示:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
...
can :update, Record do |record|
record.editors.include?(user)
end
...
end
end
请参阅 CanCan wiki 上的“ block 条件”: https://github.com/ryanb/cancan/wiki/Defining-Abilities
更新
根据您的具体需求,可以通过多种方式存储哪些用户对哪些记录具有哪些访问权限。一种方法可能是创建一个像这样的模型来存储角色分配:
class UserRecordRoles < ActiveRecord::Base
# Has three fields: role, user_id, record_id
attr_accessible :role, :user_id, :record_id
belongs_to :user_id
belongs_to :record_id
end
现在在 User 和 Record 模型中创建一个 has_many 关联,以便可以轻松查询所有角色分配。编辑器方法可能如下所示:
class Record < ActiveRecord::Base
...
has_many :user_record_roles
def editors
# This is rather messy and requires lot's of DB calls...
user_record_roles.where(:role => 'editor').collect {|a| a.user}
# This would be a single DB call but I'm not sure this would work. Maybe someone else can chime in? Would look cleaner with a scope probably.
User.joins(:user_record_roles).where('user_record_roles.role = ?' => 'editor')
end
...
end
当然,有很多方法可以做到这一点,并且根据您的需求而有很大差异。这个想法是 CanCan 可以在确定授权时与您的模型对话,这意味着您可以想象的任何逻辑都可以表示。希望这有帮助!
关于ruby-on-rails - 错误率: Different user roles for each new created record?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981947/