【问题标题】:Pyramid: ACE order in ACL金字塔:ACL 中的 ACE 顺序
【发布时间】:2013-03-22 17:15:27
【问题描述】:

我想允许未经身份验证的用户获得权限,但拒绝为经过身份验证的用户授予权限。

# works
__acl__ = [
    (Deny, Authenticated, 'something'),
    (Allow, Everyone, 'something'),
]

# order changed -- DOES NOT WORK
__acl__ = [
    (Allow, Everyone, 'something'),
    (Deny, Authenticated, 'something'),
]

我的问题是:这是从经过身份验证的用户中过滤掉未经身份验证的用户的正确方法。在 Pyramid 中是否有更明确的方法来做到这一点?如何通过说NonAuthenticated(即Everyone - Authenticated)来描述未经身份验证的用户。

一个更通用的问题是:我们应该如何过滤属于一个组但不在另一个组中的用户?

【问题讨论】:

    标签: python pyramid


    【解决方案1】:

    AuthenticatedEveryone 是主体(实际上它们只是字符串)。每个用户都有一个主体列表(默认情况下,[username, Authenticated, Everyone] 用于经过身份验证的用户,[Everyone] 用于其他用户)。您不能对主体执行集成操作,因此无法定义从 EveryoneAuthenticated 计算得出的 NonAuthenticated

    您可以做的是使用 ACL 的顺序来说明您想要什么。 documentation提到ACL是按顺序处理的,第一个匹配用户的principal的是user。因此,如果您想授予 A 组中的用户访问权限,除非他们在 B 组中(如何拥有主体“组:A”,但没有“组:B”),您可以编写。

    __acl__ = [
        (Deny, 'group:B', 'something'),   # If user in B, deny
        (Allow, 'group:A', 'something'),  # Else (=if user not in B), if user in A, allow
        (Deny, Everyone, 'something'),    # Else, Deny
    ]
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 2014-03-22
      • 1970-01-01
      • 2011-06-22
      • 2019-09-14
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      相关资源
      最近更新 更多