gpt4 book ai didi

ruby-on-rails - Pundit:确保 current_user 是来自 params 的用户

转载 作者:行者123 更新时间:2023-12-04 06:17:08 26 4
gpt4 key购买 nike

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

所以这是我的 new我的 Controller 中的操作:

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 策略中处理此授权方案,而不是在我的 Controller 中处理身份验证逻辑?

最佳答案

不确定这个问题是否已过时。

pundit在 Controller 中进行授权,它将传递两个对象。一个是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

您可以检查 Controller 中的策略:
class ReviewsController < ApplicationController
...
def new
@user = User.friendly.find(params[:user_id])
authorize(@user, :new?)

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

关于ruby-on-rails - Pundit:确保 current_user 是来自 params 的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34596290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com