繁体   English   中英

Pyramid 中基于动态用户的授权

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM