Pyramid中的动态用户基础授权

6 投票
2 回答
2115 浏览
提问于 2025-04-16 20:52

我正在按照Pyramid文档中的安全指南和维基教程添加授权来学习。

现在我需要根据单个用户来设置权限,而不是按组来设置。

举个例子,如果任何博客编辑都可以查看所有评论,那么只有帖子作者可以编辑自己的帖子

对于第一个任务,我会在我的根访问控制列表(ACL)中这样设置:

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

但是对于edit_post该怎么设置呢?

我看过这个回答,但对我来说似乎有点复杂,因为我并不需要建立一个资源树。

2 个回答

8

你已经在项目中创建了一个“资源树”,这个树的根节点是Root。接下来,你只需要在这个树上添加一个节点,叫做posts,这个节点会返回一个Post对象,并且这个对象的__acl__属性里只包含被授权的用户ID。然后,你可以让你的edit_posts路由使用traverse='/posts/{post_id}',这样就能在资源树中找到带有__acl__Post对象。

这并不难,这就是让Pyramid为你处理这些事情的方法。

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

另外,如果你不喜欢这种添加__acl__属性和进行授权遍历的方法,你可以自己实现一个AuthorizationPolicy,根据你想要的方式来处理一组用户和权限。

Pyramid的认证系统的重点在于它的存在,这点非常好。Pyramid并不强制你使用它,对于那些不使用认证系统的视图,性能上也不会受到影响。

4

你可能把事情想得太复杂了。首先,只有当访问者是文章的作者时,才显示一个链接到 edit_post 这个页面。这样就能解决99%的问题,因为这样做会让那些不该看到这个页面的人看不见。至于剩下的1%——那些聪明的用户手动修改网址直接访问编辑页面——可以加一些类似下面的代码:

def edit_post(request):
    ...
    if authenticated_userid(request) != author:
        raise pyramid.httpexceptions.HTTPForbidden("You are not this post's author.")

撰写回答