ruby-on-rails - 错误率: Different user roles for each new created record?

标签 ruby-on-rails authorization

我想做一个记录管理系统。系统将有 4 种不同的用户角色:AdminViewerEditorReviewer

虽然前两个很容易使用诸如 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/

相关文章:

mysql - HIPAA 合规性的数据库要求是什么?

ruby-on-rails - 如何使用capistrano部署带有rails后端的 Sproutcore 应用程序?

css - asset_path rails helper 仅使用给定的 assethost 的 dns

ruby-on-rails - 以简单的形式显示完整的错误消息?

asp.net - ASP.NET MVC 5 中基于角色的单独页面授权

ruby-on-rails - 用户可以 "read"范围记录的常见方法是什么?

azure - 将 MVC 授权属性与使用 Azure Active Directory + OWIN 的角色结合使用

ruby-on-rails - Gmate for gedit3(新版Ubuntu 11.10)

rest - 匿名访问 REST API?

apache - Apache 是否允许根据子请求的结果授权 HTTP 请求?