【问题标题】:Pundit Gem Index Page Prevent AccessPundit Gem 索引页面阻止访问
【发布时间】:2016-11-10 19:59:16
【问题描述】:

我正在使用 pundit gem 并试图弄清楚如何使用它来防止访问属于 current_user 以外的用户的索引页面。

这些示例仅讨论如何将结果范围限定为 current_user,但没有讨论如果 current_user 不是记录的所有者,如何实际阻止对页面本身的访问。

任何帮助表示赞赏

谢谢

【问题讨论】:

  • 我认为索引页面不属于任何用户。目标是否仅限于管理员访问?
  • @moveson 它是特定用户的索引页面,它就在那里。也许它不应该是索引页面,而是用户控制器中的单独操作,例如 user_posts
  • 这对我来说更有意义。下面描述的模式应该可以工作;只需将index? 替换为user_posts?。有关将authorized_to_edit? 逻辑放置在何处的替代建议,请参见下面@Fede Bonisconti 的评论。如果将它包含在 User 模型以外的任何位置,则需要调用 authorized_to_edit?(current_user) 而不是 current_user.authorized_to_edit?

标签: ruby-on-rails ruby pundit


【解决方案1】:

也许你想要这样的东西? (对于 ModelName 类)

# /policies/model_name_policy.rb

class ModelNamePolicy
  attr_reader :current_user, :resource

  def initialize(current_user, resource)
    @current_user = current_user
    @resource = resource
  end

  def index?
    current_user.authorized_to_edit?(resource)
  end

end

# /models/user.rb

class User < ActiveRecord::Base

  def authorized_to_edit?(resource)
    admin? | (id == resource.created_by) # Or whatever method you want to call on your model to determine ownership
  end

end

编辑:请注意,您还需要从控制器调用 authorize 来调用策略。

【讨论】:

  • IMO:Pundit 背后的想法是不在您的模型中包含您的授权逻辑。
  • 接受其他建议。如果authorized_to_edit? 用于许多模型的策略中,您会将它放在哪里?
  • authorize_to_edit 应该在每个模型的每个策略中定义。如果您的某些模型共享相同的授权逻辑,您可以使用类/mixin 来避免重复代码
  • 它是特定用户的索引页面,它就在那里。也许它不应该是索引页面,而是用户控制器中的单独操作,例如 user_posts
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2017-08-01
  • 2015-10-23
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多