gpt4 book ai didi

ruby-on-rails - 应用程序逻辑与授权

转载 作者:行者123 更新时间:2023-12-04 05:48:25 28 4
gpt4 key购买 nike

我在 Rails 中使用 cancan gem,但这可能比那更通用。

简短介绍。在 cancan 中,您可以这样定义授权:

can :read, Post
can :manage, Post if user.is_admin?
can :manage, Post do |post| post.author == user end

这意味着任何人都可以阅读帖子,但只有作者和管理员可以管理(编辑/销毁)它们。

现在我想更改我的应用程序逻辑,以便您不能删除有任何评论的帖子(除非您是管理员)。使用 cancan 仍然很容易(添加在上一个片段的末尾):

cannot :destroy, Post do |post| post.comments.count > 0 && !user.is_admin? end

这意味着我可以在 View (HTML 模板)中使用以下伪代码:

<h1><%=post.title%></h1>
<p><%=post.text%></p>
<%=link_to 'Edit', edit_post_path(post) if can? :edit, post%>
<%=link_to 'Delete', delete_post_path(post) if can? :destroy, post%>

我唯一的问题是将权限本身与应用程序逻辑混合是否合理?感觉有点脏,但另一方面我需要打破 DRY 并在应用程序的任何地方(前端、API 等)用双重检查取而代之

<h1><%=post.title%></h1>
<p><%=post.text%></p>
<%=link_to 'Edit', edit_post_path(post) if post.can_be_edited? && can? :edit, post%>
<%=link_to 'Delete', delete_post_path(post) if post.can_be_destroyed? && can? :destroy, post %>

最佳答案

我认为将授权相关行为的检查放在您建议的位置没有任何问题。正如您所提到的,替代方案更糟糕。此外,这意味着有人可以轻松地在一个地方查看 Post 的授权方案,这是非常可取的。替代方案(在多个地方进行检查)更难维护和推理,更不用说更改必须在多个地方进行编辑,这只是开发人员同时编辑它们的“君子协议(protocol)”才能保留它们同步中。

关于ruby-on-rails - 应用程序逻辑与授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25574275/

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