Python 金字塔:ACL中的ACE顺序

Python 金字塔:ACL中的ACE顺序,python,pyramid,Python,Pyramid,我想允许对未经身份验证的用户授予权限,但对经过身份验证的用户拒绝授予权限 # works __acl__ = [ (Deny, Authenticated, 'something'), (Allow, Everyone, 'something'), ] # order changed -- DOES NOT WORK __acl__ = [ (Allow, Everyone, 'something'), (Deny, Authenticated, 'someth

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

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

# order changed -- DOES NOT WORK
__acl__ = [
    (Allow, Everyone, 'something'),
    (Deny, Authenticated, 'something'),
]
我的问题是:这是从经过身份验证的用户中筛选出未经身份验证的用户的正确方法吗。在金字塔中有没有更明确的方法?我如何通过说“未验证”来描述未经验证的用户,即“所有人都已验证”

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

经过身份验证,每个人都是主体,事实上,他们只是字符串。默认情况下,每个用户都有一个主体列表[username,Authenticated,Everyone],对于已验证的用户是[Everyone],对于其他用户是[Everyone]。您不能对主体执行集成操作,因此不可能定义一个从所有人计算并经过身份验证的未经身份验证的集合

您可以做的是使用ACL的顺序来说明您想要什么。其中提到ACL是按顺序处理的,与用户主体匹配的第一个ACL是user。所以,如果你想给A组中的用户授予访问权,除了他们在B组中,那么主体“group:A”而不是“group: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
]
每个人都是主体,事实上,他们只是字符串。默认情况下,每个用户都有一个主体列表[username,Authenticated,Everyone],对于已验证的用户是[Everyone],对于其他用户是[Everyone]。您不能对主体执行集成操作,因此不可能定义一个从所有人计算并经过身份验证的未经身份验证的集合

您可以做的是使用ACL的顺序来说明您想要什么。其中提到ACL是按顺序处理的,与用户主体匹配的第一个ACL是user。所以,如果你想给A组中的用户授予访问权,除了他们在B组中,那么主体“group:A”而不是“group: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
]