gpt4 book ai didi

ruby-on-rails - Pundit 授权当前用户

转载 作者:行者123 更新时间:2023-12-04 02:18:59 24 4
gpt4 key购买 nike

我创建、更新和销毁“喜欢”的政策要求用户登录。

我已将政策措辞如下:

class LikePolicy < ApplicationPolicy
def create?
user && record.user_id == user.id
end

def update?
create?
end

def destroy?
create?
end
end

我的 likes#create Controller 操作如下:
def create
@article = Article.find(params[:article_id])
@like = @article.likes.new(user_id: current_user.id, value: params[:value] == 1 : 1 ? -1)
authorize(@like)
@like.save
redirect_to @article
end

这可行,但是使用策略来确认用户已登录是不合逻辑的,因为代码将在先前引用 current_user 的位置失败。

这是如何授权包含 user_id 的记录的公认做法吗?

最佳答案

通常我会通过单独的身份验证检查来检查用户是否已登录。如果您的应用程序主要需要用户登录,那么在授权之前进行身份验证检查将确保您始终拥有 current_user .

同样对于创建,我发现我不喜欢调用 new/authorize/save 只是为了确保用户正在创建一个属于他们的对象。那是与授权无关的应用程序逻辑。 Pundit 不介意,您可以简单地传入类,而不是创建。

根据您是否首先进行身份验证检查,您的授权可以简单地返回 true,或者您可以检查 !user.nil .

我发现对 Pundit 有帮助的最后一件事是尝试将逻辑抽象为某种自我记录的方法。它使阅读权威政策更容易,还允许您将逻辑片段抽象到 ApplicationPolicy 或通过模块包含它们。在下面的示例中 is_owner?可以很容易地抽象出来,因为它可以在许多情况下使用。

示例 1:先验证再授权

class LikesController
# Either from devise, or define in ApplicationController
before_action :authenticate_user!

def create
authorize(Like)
article = Article.find(params[:article_id])
article.likes.create(user_id: current_user.id, ...)
redirect_to article
end
end

class LikePolicy < ApplicationPolicy
def create?
true
end

def update?
is_owner?
end

def destroy?
is_owner?
end

private

def is_owner?
user == record.user
end
end

示例 2:仅授权
class LikesController
def create
authorize(Like)
article = Article.find(params[:article_id])
article.likes.create(user_id: current_user.id, ...)
redirect_to article
end
end

class LikePolicy < ApplicationPolicy
def create?
!user.nil?
end

def update?
is_owner?
end

def destroy?
is_owner?
end

private

def is_owner?
user && user == record.user
end
end

关于ruby-on-rails - Pundit 授权当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32430024/

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