【问题标题】:How do I authorize a controller action with Pundit if authorization depends on an instance variable?如果授权取决于实例变量,我如何使用 Pundit 授权控制器操作?
【发布时间】:2016-10-17 02:57:54
【问题描述】:

我有一个 wedding 类和许多 organizers,并且资源是嵌套的,因此,要查看活动的组织者,我必须访问:/events/23/organizers

组织者的索引控制器是这样的:

Class OrganizersController < ApplicationController
  def index
    @wedding = Wedding.find(params[:wedding_id]
    @organizers = Organizer.where(wedding: @wedding)
  end
end

问题是,我如何允许权威人士授权 OrganizersController 的索引操作,并且仅当实例中的 @wedding @wedding.organizers.find(user: current_user).present? 时才授权?

它们是两种完全不同的模型,一个的授权取决于另一个。

【问题讨论】:

    标签: ruby-on-rails authorization pundit


    【解决方案1】:

    我假设Organizer 属于Wedding,在这种情况下您应该拥有@organizers = @wedding.organizers

    但是,要回答有关权威人士授权的问题,您应该查看scopes。从这里,您可以返回当前用户作为组织者所属的婚礼。

    您还应该与当前用户作为组织者有许多婚礼的关系。因此,您将拥有类似 current_user.weddings 的内容,因为用户通过 organizer 举办了许多婚礼。

    【讨论】:

    • 当然可以,但是current_user 有很多weddings,而我们所说的wedding 查找的唯一方法是查找@wedding。此外,范围只会限制用户列表。我想禁止用户在 /weddings/3/organizers 查看婚礼组织者的索引,除非用户是组织者之一。
    【解决方案2】:

    我最接近的答案是this

    我通常这样做的方式是添加一个list_organizers? 谓词到 婚礼政策,然后:

    authorize(@wedding, :list_organizers?)
    

    虽然不是很优雅。

    如果您找到更好的方法,请回答,我会接受它作为更好的方法。

    【讨论】:

      【解决方案3】:

      您可以在组织控制器的索引操作中添加authorize @wedding 吗?猜测您的身份验证已经设置为检查用户是否应该有权访问婚礼。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 2014-06-23
        • 1970-01-01
        • 2016-03-07
        相关资源
        最近更新 更多