1

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

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

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

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

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

4

1 回答 1

4

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

您可以做的是使用 ACL 的顺序来说明您想要什么。文档中提到 ACL 是按顺序处理的,第一个匹配用户主体的就是 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
]
于 2013-03-22T09:15:27.117 回答