Ruby on rails 检查Rails CanCanCan授权中的操作参数

Ruby on rails 检查Rails CanCanCan授权中的操作参数,ruby-on-rails,ruby-on-rails-5,cancancan,Ruby On Rails,Ruby On Rails 5,Cancancan,在ability.rb中定义能力时,是否可以访问控制器参数 我有一个活动和用户可以参与或创建该活动。似乎我可以为每个可能的场景创建不同的控制器操作,例如,用户自己注册一个事件或创建者从事件中删除某人。不过,我认为,如果操作更少,并且能够根据从客户端传入的参数定义功能,那么阅读起来就会容易得多 答复 @chumakoff在下面有一些很好的信息,帮助解释了CanCanCan是如何工作的。我决定在默认情况下在ability.rb中授权这些操作,然后在控制器中引发一个错误,例如raise CanCan:

ability.rb
中定义能力时,是否可以访问控制器参数

我有一个活动和用户可以参与或创建该活动。似乎我可以为每个可能的场景创建不同的控制器操作,例如,用户自己注册一个事件或创建者从事件中删除某人。不过,我认为,如果操作更少,并且能够根据从客户端传入的参数定义功能,那么阅读起来就会容易得多

答复
@chumakoff在下面有一些很好的信息,帮助解释了CanCanCan是如何工作的。我决定在默认情况下在
ability.rb
中授权这些操作,然后在控制器中引发一个错误,例如
raise CanCan::AccessDenied.new(“您无法从此事件中删除其他人”)
,如果我检测到发送的用户/事件参数ID不正确。

是的,有一个名为“pry”的调试工具。用它来帮助你。只要在你想检查代码中参数值的任何地方使用
binding.pry,控制台就会停止执行,这样你就可以检查参数值。

如果我理解正确,您正在使用cancan的
authorize\u resource
load\u和\u authorize\u resource
控制器帮助程序,它根据控制器操作名称计算用户能力

但并非所有操作都必须使用此帮助器。对于具有复杂能力逻辑的操作,您可以跳过它,并手动检查能力

例如:

class ParticipationsController < ApplicationController
  authorize_resource except: :create # skiping `authorize_resource` for `create` action

  # ...

  def create
    if creator_adds_someone_to_event?
      authorize! :add_to, @event
    end

    if user_signs_up_for_event?
      authorize! :sign_up_for, @event
    end
    # ...
  end
类参与控制器

因此,您可以在同一控制器动作中检查许多不同的能力。只需为操作禁用默认的
cancancan的
行为。

嘿,看起来很接近!来源:为什么要在创建操作中授权其他操作?我在想我应该检查/授权每一项行动。通过测试,它看起来像是
authorize
关键字应用在
ability.rb
中设置的任何权限,因此我猜算法应该是在
ability.rb
中不为这些操作创建任何规则,然后进行
授权。不知为什么,这是一种坏习惯吗?看起来有点复杂。看起来您可以在控制器操作中手动抛出错误,而不是通过
授权尝试捕获该功能-您认为哪个选项更好
raise CanCan::AccessDenied.new(“未授权!”)
-将复杂逻辑放在一个操作中可能是一种不好的做法。拥有与控制器动作不匹配的能力动作是正常情况。只有在
授权的情况下,才应
提出CanCan::AccessDenied
并不能完全满足您的要求。例如,如果您想更改错误消息,那么“能力操作不=控制器操作”是什么意思?我可以看出,将能力逻辑从ability.rb扩展到不同的操作可能很难维护,但如果我想访问客户端参数,似乎没有太多选择。考虑到这一切,这就是我的想法。在
ability.rb
中授权这些操作,并检查控制器操作中的参数。如果他们引用了错误的用户/事件,
将引发一个错误。听起来不错?如果不看你的代码和逻辑,很难判断。所以,祝你好运!)