[英]Dynamic user based authorization in Pyramid
我正在遵循Pyramid 文档中的安全指南以及 wiki 教程添加授权
现在我需要添加基于单个用户而不是组的限制。
比方说,如果任何博客编辑都有权查看所有评论,那么只有帖子作者可以编辑帖子本身。
对于我的根 ACL 中的第一个任务,如下所示:
__acl__ = [ (Allow, Everyone, 'view'),
(Allow, Authenticated, 'view_profile'),
(Allow, 'groups:editor', 'edit_comment')
]
但是对于edit_post
呢?
我已经阅读了这个答案,但由于我不需要构建资源树,因此对我的需求来说似乎有点过分了。
通过在项目中创建Root
资源,您已经拥有了一个“资源树”。 您只需要在其上添加一个节点,该节点将返回一个Post
posts
,其中包含仅包含授权用户 ID 的特定__acl__
。 然后,您可以让您的edit_posts
路由使用traverse='/posts/{post_id}'
将您的资源树遍历到带有__acl__
的Post
object。
这并不难,而且是让 Pyramid 为您做这些事情的方法。
如果您不想使用permission
参数,您可以在视图本身内部进行授权,就像 Kirk 建议的那样。
此外,如果您不喜欢这种添加__acl__
属性和遍历授权的方法,您可以实现自己的AuthorizationPolicy
以使用给定的委托人列表和权限执行您希望它执行的操作。
Pyramid 的身份验证系统的重点是它就在那里,这很棒。 Pyramid 绝不要求您使用它,对于不使用它的视图,处理它不会影响性能。
你可能把这弄得太复杂了。 首先,如果访问者是帖子的作者,则仅显示指向edit_post
视图的链接。 通过使该视图对不应该看到它的人不可见,这将解决 99% 的问题。 对于另外 1% - 聪明的用户手动编辑 URL 以直接访问编辑视图 - 添加如下内容:
def edit_post(request):
...
if authenticated_userid(request) != author:
raise pyramid.httpexceptions.HTTPForbidden("You are not this post's author.")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.