6

我正在遵循Pyramid 文档中的安全指南以及 wiki 教程添加授权

现在我需要添加基于单个用户而不是组的限制。

比方说,如果任何博客编辑都有权查看所有评论,那么只有帖子作者可以编辑帖子本身

对于我的根 ACL 中的第一个任务,如下所示:

__acl__ = [ (Allow, Everyone, 'view'),
            (Allow, Authenticated, 'view_profile'),
            (Allow, 'groups:editor', 'edit_comment')
]

但是为什么edit_post

我已经阅读了这个答案,但由于我不需要构建资源树,因此对我的需求来说似乎有点过分了。

4

2 回答 2

8

Root通过在项目中创建资源,您已经拥有了“资源树” 。您只需要在其上添加一个节点posts,它将返回一个Post对象,该对象的特定对象__acl__仅包含授权用户 ID。然后,您可以使用您的edit_posts路线traverse='/posts/{post_id}'将您的资源树遍历到Post带有 的对象__acl__

这并不难,而且是让 Pyramid 为您做这些事情的方法。

如果您不想使用该permission参数,您可以在视图本身内部进行授权,就像 Kirk 建议的那样。

此外,如果您不喜欢这种添加__acl__属性和遍历授权的方法,您可以实现自己的AuthorizationPolicy方法来使用给定的委托人列表和权限来执行您希望它执行的操作。

Pyramid 的身份验证系统的重点是它就在那里,这很棒。Pyramid 绝不要求您使用它,对于不使用它的视图,处理它不会影响性能。

于 2011-07-05T20:04:59.000 回答
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.")
于 2011-07-05T16:23:01.823 回答