【发布时间】:2021-01-29 13:58:06
【问题描述】:
我注意到用户可以访问他们不应该访问的操作。
我在 Rails 控制台中 debugged 使用类似的东西
user = User.first
physician = Physician.first
ability = Ability.new(user)
ability.can?(:send_message, physician)
# => false
上面说用户不能访问该医生的 send_message 操作,这是期望的行为,但我知道他们可以在应用程序中!
我认为这缩小了cancancan由于某种原因加载错误模型实例的问题的原因。 cancan 文档中也暗示了这一点:
注意:这假设模型实例正在正确加载。
但问题是我不确定如何从这里诊断问题,因为控制台说它应该可以工作。不知道怎么查看cancancan设置的模型实例,也不知道还有什么办法。
有什么想法吗?
更新
我确实设法通过在控制器中使用 authorize! :send_message, physician 来解决这个问题,但是因为我只是偶然发现了这种行为,我认为找出错误模型的原因更为重要正在加载实例(尤其是这样我可以查看其他地方是否也发生了这种情况)。
我知道为什么它可能会发生(但我仍然不知道如何诊断它)
我认为发生这种情况是因为我有许多自定义操作,其中一些有 @physician = Physician.find(current_user.physician.id)(即他们是当前用户),而另一些则更像 @physician = Physician.find_by_id(physician_params[:id])。我不确定 cancan 如何设置实例模型,但我知道它不是通灵的,所以它不知道是将其设置为当前用户的医生实例,还是传入的医生 ID 的医生实例。
还剩下什么?
cancancan 如何为自定义方法设置模型实例(我认为它会尝试某些方法,如果不起作用,请尝试其他方法等)?
有帮助的小笔记:
-
load_and_authorize_resource确实尝试为 non RESTful actions 加载模型实例 - docs 中的一些有用信息
- This 可能与我的经历有关:
当我返回 slug 时,它会破坏这种行为,我可以编辑所有口袋妖怪。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-6 cancan cancancan