Rolify scope roles to many objects and different 类 Rails 6

Rolify scope roles to many objects and different classes Rails 6

我正在尝试“扩展”Rolify 功能以具有一些全局角色,例如 'Admin'、'Member'、'Guest' 等...并能够设置每个具有特定角色的用户都有不同的“范围”。

例如,在我的应用程序中,我有这个 admin 角色,这是一个“超级角色”,意味着它几乎可以访问所有内容。但我也希望能够为另一个用户“确定”这个角色,范围将是,例如 'he will have access to all users, but only if they are from countries A, B, C and from cities X, Y, Z'。我知道 rolify 支持不同范围的不同角色,但我想要的是只为不同的用户管理不同范围的“全局角色”。

我考虑过做一些类似于属于角色和用户的 'Scope' 模型,在其中我将与国家和城市建立 HABTM 关系,然后使用它进行授权(我是使用 CanCanCan)。但是在使用这种方法时,我 运行 遇到了很多问题。它是这样的:

class Scope
  belongs_to :user
  belongs_to :role

  has_and_belongs_to_many :countries
  has_and_belongs_to_many :cities
end

我 运行 遇到的一个问题是我需要在创建范围的同时 g运行 角色,如果用户是 'revoked'一个角色,属于用户和角色的作用域,需要销毁。我发现最后一部分特别难,因为 'Scope' 与 'users_roles' table.

无关

有人知道解决这个问题的更好方法吗?我很难找到正确的方法来为每个用户设置一个具有自定义范围的角色(基本上我需要在用户和角色中间有一些东西来定义用户的角色范围)。

感谢我能得到的任何帮助!

如果你想创建自己的东西 has_and_belongs_to_many 不是答案(提示:it's almost never the right answer). Using HABTM is the akilles heel of Rolify 因为它的关联看起来像这样:

class User
  has_and_belongs_to_many :roles
end

class Role
  has_and_belongs_to_many :users
  belongs_to :resource, 
    polymorphic: true,
    optional: true
end

这不允许您直接查询 users_roles table 或添加其他列或逻辑。自 2013 年以来,修复它一直是一个悬而未决的问题。有一些解决方法,但无论如何,Rolify 可能不是完成这项工作的正确工具。

如果你想自己动手,你想使用 has_many through: 来设置一个实际的连接模型,这样你就可以直接查询连接 table 并向它添加关联、附加列和逻辑。

class User
  has_many :user_roles
  has_many :roles, through: :user_roles
end

class UserRole
  belongs_to :user
  belongs_to :role 
  belongs_to :resource, 
    polymorphic: true,
    optional: true
  validates_uniqueness_of :user_id,
    scope: [:role_id, :resource_id, :resource_type]
end

class Role
  validates :name, presence: true, 
                   uniqueness: true
  has_many :user_roles
  has_many :roles, through: :user_roles
end

这将资源范围从按角色划分为按用户划分。

虽然您可以在 user_roles table 和“作用域”资源之间添加额外的连接 tables,但除非您想避免多态关联,否则它不是严格必要的。