繁体   English   中英

具有权限连接表的声明性授权

[英]Declarative Authorization with a permissions join table

用户有权管理位置和类别的特定组合的文章。

例如,Dave可能被允许管理巴黎的HR文章。 保罗可能被允许管理伦敦的商业文章。

模型及其关联如下:

  • 用户有很多权限
  • 权限属于用户,位置和类别
  • 类别有很多文章和权限
  • location有很多文章和权限
  • 文章属于位置和类别

我可以说:

has_permission_on :articles, :to => :manage do
  if_attribute :location => { :permissions => { :user_id => is {user.id} }, :category => { :permissions => { :user_id => is {user.id} } }
end

当我在文章记录(其类别ID为1893,位置ID为2939)上调用allowed_to?(:delete)时,将运行以下查询:

SELECT `categories`.*  FROM `categories`  WHERE `categories`.`id` = 1893 LIMIT 1
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893)
SELECT `locations`.*   FROM `locations`   WHERE `locations`.`id` = 2939 LIMIT 1
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.location_id = 2939)

我需要运行的是:

SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893 AND `permissions`.location_id = 2939)

有没有办法实现这个目标?


更新

好的,所以我现在在文章模型中有一个实例方法:

def permitted_user_ids
  Permission.select('user_id').where(:location_id => location_id, :category_id => category_id).map(&:user_id)
end

我的规则现在是:

has_permission_on :articles, :to => :manage do
  if_attribute :permitted_user_ids => contains { user.id }
end

现在,当我在类别标识为1893且位置标识为2939的文章记录上调用allowed_to?(:delete)(或读取/更新/创建/管理)时,将运行以下查询:

SELECT user_id FROM `permissions` WHERE `permissions`.`category_id` = 1893 AND `permissions`.`location_id` = 2939

......这正是我想要的。

除了,with_permissions_to范围表现得非常奇怪。

Article.with_permissions_to(:read)

现在生成:

SELECT `articles`.* FROM `articles` WHERE (`articles`.`id` = 9473)

...其中9473是当前用户的ID!

我很困扰。

您可以使用子类并使用cancan管理权限。 您可以拥有顶级文章,然后所有类型的文章都可以是子类,并且在子类中使用cancan来管理其权限。

这应该是一个评论,但我仍然在45 :(

您说permission属于userlocationcategory 因此,权限表将具有user_id,location_id和category_id列。

如果这是真的,那你为什么要声明类别belongs_to权限和位置belongs_to权限? 当然这种关系应该是has_many

你应该在没有外键(类别和位置)的模型中使用has_many ,在模型WHICH DOES(许可)上使用belongs_to

请原谅我,如果这只是你做的一个错字,你真正的意思是权限belongs_to用户和has_many位置和类别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM