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呢?
我已经阅读了这个答案,但由于我不需要构建资源树,因此对我的需求似乎有些过分.
通过Root在项目中创建资源,您已经拥有了"资源树" .您只需要在其上添加一个节点posts,它将返回一个Post具有__acl__仅包含授权用户ID 的特定对象.然后,您可以edit_posts使用您的路径traverse='/posts/{post_id}'将资源树遍历到Post对象__acl__上.
这并不难,金字塔为你做这件事的方法.
如果你不想使用permission参数,你可以在视图本身内部进行授权,就像Kirk建议的那样.
此外,如果您不喜欢这种添加__acl__属性和遍历以进行授权的方法,您可以实现自己的操作,AuthorizationPolicy以执行您希望它与给定的主体列表和权限相关的操作.
Pyramid的auth系统的意思是它就在那里,这很棒.金字塔绝不要求您使用它,对于不使用金字塔的视图,处理它不会影响性能.
你可能把这件事搞得太复杂了。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)