显然,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逻辑?
答案 0 :(得分:2)
不确定此问题是否已过期。
当pundit
在控制器中执行授权时,它将传递两个对象。一个是record
,另一个是current_user
。但是,您只需在调用record
方法时提供authorize
,current_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