Pyramid中的动态用户基础授权
我正在按照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.")