Pundit或CanCan gem是否允许逐个用户,逐个控制器的权限?

时间:2016-12-23 18:46:16

标签: ruby-on-rails ruby cancan pundit

我的网站上有一个管理部分,其中包含30个功能的链接。我们希望拥有它,以便每个客户服务代表都可以在非常精细的个人层面上访问这些页面(即,Joe将被授予访问页面A和B,但不能访问C; Mary可以访问A和C ,但不是B)。

Pundit或CanCan能够像这样工作吗?或者我最好创建一个与用户相关的Permission模型,每个管理功能都有一个布尔列?我希望避免这种情况,因为我可以看到它快速失控。

1 个答案:

答案 0 :(得分:2)

您可以使用单个整数列并使用位掩码来存储N个布尔值,而不是为每个要素创建列。如果需要,有一些ruby库可以为您执行此操作,例如Bitfields

另一种方法是在管理员和功能之间创建一个连接表(habtm关系)(如果他们还没有添加功能作为db支持的模型),那么授予权限就像添加一行一样简单到连接表。这是一个例子:

class User < ApplicationRecord
  has_and_belongs_to_many :features
end

class Feature < ApplicationRecord
  has_and_belongs_to_many :users
end

# authorization
def authorized?(current_user, requested_feature)
  current_user.features.where(id: requested_feature.id).exists?
end