我想允许未经身份验证的用户获得权限,但拒绝经过身份验证的用户。
# works
__acl__ = [
(Deny, Authenticated, 'something'),
(Allow, Everyone, 'something'),
]
# order changed -- DOES NOT WORK
__acl__ = [
(Allow, Everyone, 'something'),
(Deny, Authenticated, 'something'),
]
我的问题是:这是从经过身份验证的用户过滤掉未经身份验证的用户的正确方法吗?在Pyramid中有更明确的方法吗?如何通过说出NonAuthenticated
(Everyone - Authenticated
)来描述未经身份验证的用户。
一个更通用的问题是:我们应该如何筛选一个组中的用户而不是另一个组中的用户?
答案 0 :(得分:4)
Authenticated
和Everyone
是主体(事实上,它们只是字符串)。每个用户都有一个主体列表(对于经过身份验证的用户,默认情况下为[username, Authenticated, Everyone]
,对于其他用户,则为[Everyone]
)。您无法对主体执行整体操作,因此无法定义从NonAuthenticated
和Everyone
计算的Authenticated
。
您可以使用ACL的顺序来说明您想要的内容。 documentation提到ACL按顺序处理,第一个匹配用户主体的是用户。因此,如果您想要为A组中的用户提供访问权限,除非他们在B组中(主要'组: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
]