【问题标题】:CanCanCan ability to create Invite resource if User can manage Group如果用户可以管理组,CanCanCan 能够创建邀请资源
【发布时间】:2020-05-04 20:19:14
【问题描述】:

我定义了以下组能力:

# Group abilities
can :manage, Group do |group|
  user.in_group?(group, as: :owner)
end

我想要的邀请是这样的:

can :manage, Invite do |invite|
  can?(:manage, invite.group)
end

换句话说,我想支持能够为他们所属的组创建邀请的用户。由于组可以有多个所有者(通过 GroupMemberships 对象),我不能使用简单的关联哈希规则。我也不能使用块,因为InvitesController#create 中没有@invite 的实例。

你会如何为这个场景编写能力规则?

【问题讨论】:

    标签: ruby-on-rails authorization cancancan


    【解决方案1】:

    如果我理解了你并且正确提供的少量代码,你可以这样做:

    can :manage, Invite do |invite|
      user.in_group?(invite.group, as: :owner)
    end
    

    【讨论】:

    • 是的,我希望保持能力文件干燥,而不是重复邀请的授权逻辑,而是说,“如果他们可以管理他们邀请用户加入的组,那么他们'被允许创建邀请"
    • 是的,另一个问题是user.in_group?(invite.group, as: :owner) 不起作用,因为:create 操作中没有可用的@invite 变量。我相信 CanCanCan 改用类名。
    • 您可能不得不手动调用授权,而不是使用load_and_authorize_resource。如前所述,当您遇到更复杂的场景时,CanCanCan 会变得非常糟糕。
    • 所以你必须调用can?(:manage, @group) 然后创建新实例。
    【解决方案2】:
    can :manage, Invite, group: { group_memberships: { user: user, membership_type: 'owner' } }
    

    是最终在控制器中使用以下 CanCanCan 挂钩为创建操作工作的能力:

    class InvitesController < ApplicationController
      load_and_authorize_resource :group
      authorize_resource :invite, through: :group
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多