【问题标题】:Declarative Authorization with a permissions join table带有权限连接表的声明式授权
【发布时间】:2012-12-21 19:58:46
【问题描述】:

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

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

模型及其关联如下:

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

我可以说:

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

现在,当我对类别 ID 为 1893 且位置 ID 为 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!

我很困惑。

【问题讨论】:

    标签: ruby-on-rails ruby declarative-authorization


    【解决方案1】:

    您可以使用子类并使用cancan 管理权限。 你可以有一个顶级文章,然后所有类型的文章都可以是子类,在子类中你可以使用 cancan 来管理它们的权限。

    【讨论】:

      【解决方案2】:

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

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

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

      您应该在没有外键(类别和位置)的模型中使用has_many,在有外键(权限)的模型中使用belongs_to

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

      【讨论】:

      • 你说得对——权限属于用户、位置和类别,用户、位置和类别各自有很多权限——我已经更正了这个问题。干杯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2023-03-05
      • 1970-01-01
      • 2014-09-05
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多