2013-03-22 52 views
1

我想允許未經過身份驗證的用戶的權限,但是拒絕通過身份驗證的用戶的權限。金字塔:ACL中的ACE訂單

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

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

我的問題是:這是正確的方式來過濾未經身份驗證的用戶身份驗證的用戶。在金字塔中是否有更明確的方法?我如何通過說NonAuthenticated(這是Everyone - Authenticated)描述未經認證的用戶。

更常見的問題是:我們應該如何篩選一個組中的用戶而不是另一個組中的用戶?

回答

4

AuthenticatedEveryone是校長(實際上,他們只是字符串)。每個用戶都有一個委託人列表(默認情況下爲[username, Authenticated, Everyone],其他人爲[Everyone])。您無法對主體進行集合操作,因此無法定義從EveryoneAuthenticated計算得出的NonAuthenticated

你可以做的是使用ACL的順序來陳述你想要的。 documentation提到ACL按順序處理,並且匹配用戶主體的第一個用戶是用戶。因此,如果您想給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 
]