【问题标题】:Pundit: auhorize Index in nested resourcesPundit:授权嵌套资源中的索引
【发布时间】:2015-10-23 13:36:10
【问题描述】:

将 Rails 4.2.4 与 Devise (3.5.2) 和 Pundit (1.0.1) 结合使用。 Decent_exposure (2.3.2)。

我有一个用户和创意的简单嵌套关联:

class User < ActiveRecord::Base
has_many :ideas
...

class Idea < ActiveRecord::Base
belongs_to :user
...

在 routes.rb 中

devise_for :users

resources :users do
  resources :ideas
end

如果 current_user 不是 Ideas 的所有者(在本例中,如果 current_user.id != 1),我只是试图禁止访问 users/1/ideas。 我不知道该怎么做。我可以在索引视图中只显示 current_user 想法:

[创意控制器]

def show
  authorize idea
end

[理念政策]

def show?
  @current_user == @idea.user
end

但是如何防止用户简单地导航到其他用户的创意索引页面? 我想在 Ideas 控制器中我应该使用类似的东西:

def index
  authorize user
end

然后呢?如何将有关创意集合的信息发送到用户策略? 还是我应该通过创意政策本身进行授权?

【问题讨论】:

    标签: ruby-on-rails-4 nested authorization pundit


    【解决方案1】:

    在此处复制my response on GitHub,因为这样会获得更多流量。


    一种方法是创建用户拥有的存根Idea 进行授权。

    def index
      @user = User::find(params[:user_id])
      idea  = Idea.new(user_id: @user.id)
    
      authorize idea
    
      # ...
    end
    

    以及IdeaPolicy 中的index? 方法

    def index?
      record.user_id = user.id
    end
    

    另一种方法是更改​​您授权的对象。不是针对Idea 进行授权,而是针对User 进行授权。

    def index
      @user = User::find(params[:user_id])
    
      authorize @user, :show_ideas?
    
      # ...
    end
    

    并在您的 UserPolicy 上创建一个新的 show_ideas? 方法

    def show_ideas?
      user.id == record.id
    end
    

    【讨论】:

    • 完美运行!!非常感谢。第二种方法对我来说更直观。再次感谢!
    • 第二种方法肯定更有意义,也更容易理解。 :)
    • deefour,哪个是首选方式? (我正在使用设备进行身份验证)
    • @SzilardMagyar 第一种方式更适合我。第二种方法,虽然乍一看可以说更具可读性,但在我看来污染了UserPolicy。我更喜欢让政策行动尽可能粗鲁:index? new? create? edit? update? destroy?。当我开始考虑创建像 can_apply_batch_action? 这样的操作时,这通常意味着我正在尝试针对错误的模型进行授权。
    • @deefour 这是否意味着如果我有嵌套路由(例如,所有模型嵌套在 Team 模型中)并且在每个其他模型的控制器/视图中执行 authorize @team, :some_policy? ,它是“好的”?所有的策略都存储在team_policy.rb?感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多