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

neu*_*ino 6 python authorization pyramid

我遵循Pyramid文档中的安全准则以及wiki教程添加授权

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

例如,假设任何博客编辑者都有权审阅所有评论,那么只有帖子作者可以编辑帖子本身.

对于我将在根ACL中执行的第一项任务,如下所示:

__acl__ = [ (Allow, Everyone, 'view'),
            (Allow, Authenticated, 'view_profile'),
            (Allow, 'groups:editor', 'edit_comment')
]
Run Code Online (Sandbox Code Playgroud)

但是为什么edit_post呢?

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

Mic*_*kel 8

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

这并不难,金字塔为你做这件事的方法.

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

此外,如果您不喜欢这种添加__acl__属性和遍历以进行授权的方法,您可以实现自己的操作,AuthorizationPolicy以执行您希望它与给定的主体列表和权限相关的操作.

Pyramid的auth系统的意思是它就在那里,这很棒.金字塔绝不要求您使用它,对于不使用金字塔的视图,处理它不会影响性能.

  • 谢谢,我越来越清楚,因为我的需求更适合(并且很容易)在视图中添加一个检查,而不是为资源创建类等等.这是我试图避免的,但是,像柯克说的那样,它没有任何问题(现在我知道了). (2认同)

Kir*_*ser 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.")
Run Code Online (Sandbox Code Playgroud)