Pundit:确保current_user是params的用户

时间:2016-01-04 17:12:49

标签: ruby-on-rails authorization pundit

显然,Pounit政策中的you can't access the params hash。有意义的是,他们希望尽可能少地向政策公开信息。但我遇到的一个用例,我认为这很常见,就是检查current_user是否是来自params的用户。

所以这是我控制器中的new动作:

class ReviewsController < ApplicationController
  ...
  def new
    @user = User.friendly.find(params[:user_id])
    unless current_user.admin? || current_user.id == @user.id
      flash[:alert] = 'Access denied.'
      redirect_to root_url
    end
    @review = @user.reviews.build
  end
  ...
end

所以在这里,我要说的是授权用户是否为管理员,或者当前用户是否与URL中的用户相同。否则,ID为2的用户可以转到/users/1/reviews/new

在政策中似乎没有办法解决这个问题,因为我无法将params[:user_id]传递给政策。

有没有办法从Pundit策略处理这个授权方案,而不是在我的控制器中处理auth逻辑?

1 个答案:

答案 0 :(得分:2)

不确定此问题是否已过期。

pundit在控制器中执行授权时,它将传递两个对象。一个是record,另一个是current_user。但是,您只需在调用record方法时提供authorizecurrent_user将自动传递。

#authorize(record, query = nil) ⇒ true

在您的情况下,当您致电authorize(@user, :new?)时,在您的政策中,@user将被引用为record,而current_user将被引用为user

因此,在您的政策中:

class UserPolicy < ApplicationPolicy
  def new?
    user.admin? || record == user
  end
end

您可以查看控制器中的政策:

class ReviewsController < ApplicationController
  ...
  def new
    @user = User.friendly.find(params[:user_id])
    authorize(@user, :new?)

    @review = @user.reviews.build
  end
  ...
end