我正在关注security guidelines found on Pyramid docs以及wiki教程Adding Authorization
现在我需要添加基于非单个用户而不是组的限制。
比方说,如果任何博客编辑有权审核所有评论,只有帖子作者可以自行编辑帖子。
对于我的根ACL中的第一个任务,如下所示:
__acl__ = [ (Allow, Everyone, 'view'),
(Allow, Authenticated, 'view_profile'),
(Allow, 'groups:editor', 'edit_comment')
]
但对edit_post
感到满意?
我已经阅读了this answer,但由于我不需要构建资源树,因此对我的需求似乎有些过分。
答案 0 :(得分:8)
通过在项目中创建Root
资源,您已拥有“资源树”。您只需要为posts
添加一个节点,该节点将返回一个Post
对象,该对象具有仅包含授权用户ID的特定__acl__
。然后,您可以使用edit_posts
路由使用traverse='/posts/{post_id}'
将资源树遍历到Post
对象,并在其上显示__acl__
。
这并不困难,并且让金字塔为你做这件事。
如果你不想使用permission
参数,你可以在视图本身内部进行授权,就像Kirk建议的那样。
此外,如果您不喜欢这种添加__acl__
属性和遍历以进行授权的方法,您可以实现自己的AuthorizationPolicy
来执行您希望对给定列表执行的操作校长和许可。
Pyramid的auth系统的意思是它就在那里,这很棒。金字塔绝不要求你使用它,对于不使用它的视图,处理它不会对性能产生影响。
答案 1 :(得分:4)
你可能会让这太复杂了。首先,如果访问者是帖子的作者,则只显示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.")