金字塔中基于动态用户的授权

时间:2011-07-05 15:41:43

标签: python authorization pyramid

我正在关注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,但由于我不需要构建资源树,因此对我的需求似乎有些过分。

2 个答案:

答案 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.")