【问题标题】:Dynamic user based authorization in PyramidPyramid 中基于动态用户的授权
【发布时间】:2011-09-28 22:43:15
【问题描述】:

我正在关注security guidelines found on Pyramid docs 以及维基教程Adding Authorization

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

例如,如果任何博客编辑都有权审查所有 cmets,只有帖子作者可以编辑帖子本身

对于我的根 ACL 中的第一个任务,如下所示:

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

但是edit_post 呢?

我已阅读 this answer,但由于我不需要构建资源树,因此对于我的需求来说似乎有点过头了。

【问题讨论】:

    标签: python authorization pyramid


    【解决方案1】:

    你可能把它弄得太复杂了。首先,如果访问者是帖子的作者,则仅显示指向 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.")
    

    【讨论】:

    • 我认为剩下 1% 的人愿意搞砸事情是对的......无论如何,因为部分身份验证(例如edit_comment)是我愿意让事情保持不变的观点大大地。至少在您凝视时这不会变得太复杂......现在+1。
    • 好吧,将这些限制构建到全局策略中而不是在视图中实现它们的想法没有错。不过,有时这些观点是正确的。我可以很容易地想象出许多基于一天中的时间、服务器负载、昂贵的计算等的更复杂的限制,在这些限制中尝试编写一个全面的顶级策略会很痛苦。
    • 谢谢,现在对我有意义。
    【解决方案2】:

    通过在您的项目中创建 Root 资源,您已经拥有一个“资源树”。您只需在其上为 posts 添加一个节点,该节点将返回一个带有特定 __acl__Post 对象,该对象仅包含授权用户 ID。然后,您可以让您的 edit_posts 路由使用 traverse='/posts/{post_id}' 遍历您的资源树到带有 __acl__Post 对象。

    这并不难,而且是让 Pyramid 为你做这些事情的方法。

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

    另外,如果您不喜欢这种添加 __acl__ 属性和遍历授权的方法,您可以实现自己的 AuthorizationPolicy 来使用给定的委托人列表和权限。

    Pyramid 身份验证系统的关键在于它就在那里,这很棒。 Pyramid 绝不要求您使用它,对于不使用它的视图,处理它不会影响性能。

    【讨论】:

    • 谢谢,这对我来说越来越清楚了,因为我的需要更适合(也很容易)在视图本身中添加检查,而不是为资源创建类等等。这是我试图避免的,但正如柯克所说,这并没有错(现在我知道了)。
    • 我真的很喜欢你的方法,Michael,它可能是大多数情况下的“正确”解决方案。在我自己的项目中,决策过程中有一些极其复杂的业务规则,并且这些规则在每个视图中都不同。这可能是让我准备好并愿意跳出全局配置火车转而在本地处理一些东西的原因。
    • Kirk,您对速率限制和特殊注意事项的看法是正确的。然而,这些要求通常与简单地检查对象的所有权或允许用户首先实际做某事的高级网关的必要性正交。还有很多这些额外的检查是很多人在中间件中做的事情(尤其是速率限制),因此在进入你的应用程序之前就可以解决。另外不要忘记,每个对象都可以动态提供其 acl,因此它可以根据某些条件临时删除用户的所有权。
    • 这对我来说感觉像是很多额外的工作。这可能不是解决这个问题的地方,但是你有一个文章的链接,解释我为什么要重新考虑?我非常愿意改变,尤其是在我正在从事的大型项目中还很早的时候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多