Pundit:在嵌套资源中授权索引

2023-12-04

将 Rails 4.2.4 与 Devise (3.5.2) 和 Pundit (1.0.1) 结合使用。体面的曝光(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

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

def index
  authorize user
end

但然后呢?如何向用户政策发送有关创意收集的信息? 或者我应该通过创意政策本身进行授权?


复制我在 GitHub 上的回复在这里,因为这会带来更多流量。


一种方法是创建存根Idea由用户拥有以授权反对。

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

  authorize idea

  # ...
end

and an index?方法在你的IdeaPolicy

def index?
  record.user_id = user.id
end

另一种方法是更改​​您授权的内容。而不是授权反对Idea,授权反对User.

def index
  @user = User::find(params[:user_id])

  authorize @user, :show_ideas?

  # ...
end

并创建一个新的show_ideas?方法对你的UserPolicy

def show_ideas?
  user.id == record.id
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pundit:在嵌套资源中授权索引 的相关文章

随机推荐