我在Rails中使用了cancan
gem,但这可能比这更普遍。应用程序逻辑与授权
简短介绍。在cancan
,你定义授权这样的:
can :read, Post
can :manage, Post if user.is_admin?
can :manage, Post do |post| post.author == user end
这意味着,任何人都可以阅读Post
S,但只有作者和管理员可以管理(编辑/销毁)他们。
现在我想更改我的应用程序逻辑,以便如果它有任何评论(除非您是管理员),则不能删除您的帖子。它仍然易于使用(添加在上面代码的结尾)cancan
:
cannot :destroy, Post do |post| post.comments.count > 0 && !user.is_admin? end
,这意味着我可以使用下面的伪码的视图(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%>
我唯一的问题是将权限本身与应用逻辑混合起来是否合理?感觉那种肮脏的,但另一方面我需要打破干燥,与应用程序中到处重复检查(前端,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 %>