2014-02-20 34 views
2

麻煩我有5種類型的用戶:經與 「細粒」 金字塔ACL

  1. 聯繫         (權限ALL)
  2. 造物主     (權限 「V」 「一」, 「M」, 「C」)
  3. 經理 (權限 「v」, 「一個」, 「M」)
  4. 分析員     (權限 「V」, 「A」)
  5. 查看器       (權限 「V」)

這是每個用戶都有每個在前用戶的權限的分層設置。要在我的項目設置的,我可以很容易地寫:

class RootFactory(object): 

    __acl__ = [ 
     (Allow, '__ADMIN__', ALL_PERMISSIONS), 
     (Allow, 'creator', ('VIEWER', 'ANALYST', 'MANAGER', 'CREATOR')), 
     (Allow, 'manager', ('VIEWER', 'ANALYST', 'MANAGER')), 
     (Allow, 'analyst', ('VIEWER', 'ANALYST')), 
     (Allow, 'viewer', ('VIEWER')), 
     (Allow, Everyone, NO_PERMISSION_REQUIRED) 
    ] 

    def __init__(self, request): 
     self.request = request 

然後,在我的views.py,例如,我做的:

@view_config(route_name='mgmt_handler', renderer='manage.jinja2', permission='MANAGER') 
def mgmt_handler(request): 
    pass # do stuff 

這很好地工作了實例。但是,我不知道如何最好地完成以下任務:根據需要

  • 如何讓我這個訪問控制更加「細粒」允許用戶1,a觀衆,會對一個特定的更高權限基礎?這是否屬於「對象級」安全領域?大多數情況下,全球根工廠就足夠了,但我如何適應那些低層用戶被授予更高權限,或者高層用戶被拒絕更低權限的情況?

  • 有沒有一種方法可以方便地確定特定用戶的原理,以便在我看來我可以說一些效果如下:if user.principle in list_of_permissions: do something...?或者,這是否僅僅是數據庫中的另一個查詢,用戶的組存儲在該數據庫中?

案例和觀點,我的目標是要有一個靈活的,分級的權限系統。什麼是最有效的方法來做到這一點?我讀過的教程只解決了更簡單的全局策略(我明白這一點)。我的部分問題是如何全面瞭解對象/實例級別的安全性。

感謝您的幫助。

回答

3

我不知道我明確地得到你想要達到的目標。據我瞭解,你有少數用戶組對系統中的每個對象具有共同的權限,並且將調整對特定用戶的特定對象的訪問權限。例如,對象的所有者擁有對象的所有權限,而不管所有者的用戶組是什麼。

首先,您應該使用location-aware resources的層次結構。這樣你可以保持默認權限根資源並調整它們的孩子之一:

class RootFactory(object): 

    __name__ = '' 
    __parent__ = None 
    __acl__ = [ 
     (Allow, '__ADMIN__', ALL_PERMISSIONS), 
     (Allow, 'creator', ('VIEWER', 'ANALYST', 'MANAGER', 'CREATOR')), 
     (Allow, 'manager', ('VIEWER', 'ANALYST', 'MANAGER')), 
     (Allow, 'analyst', ('VIEWER', 'ANALYST')), 
     (Allow, 'viewer', ('VIEWER')), 
     # (Allow, Everyone, NO_PERMISSION_REQUIRED) 
     # It seems, here you want to deny access for all other users, 
     # so you should use this: 
     # (Deny, Everyone, ALL_PERMISSIONS) 
     # or simply: 
     DENY_ALL 
    ] 

    def __init__(self, request): 
     self.request = request 

    def __getitem__(self, name): 
     return ChildObject(name, self) 

然後在子對象的構造函數,你可以添加一個特殊權限此特定對象:

class ChileObject(object): 

    def __init__(self, request, name, parent): 
     self.__parent__ = parent 
     self.__name__ = name 
     # Do some stuff, for example loading object from DB 
     # and populate other attributes of the object. 
     # Then add permission for the object's owner 
     self.__acl__ = [(Allow, self.owner_id, ALL_PERMISSIONS)] 

結果ACL將被合併根目錄的訪問控制列表和版本孩子的一個,即:

[ 
    (Allow, self.owner_id, ALL_PERMISSIONS), 
    (Allow, '__ADMIN__', ALL_PERMISSIONS), 
    (Allow, 'creator', ('VIEWER', 'ANALYST', 'MANAGER', 'CREATOR')), 
    (Allow, 'manager', ('VIEWER', 'ANALYST', 'MANAGER')), 
    (Allow, 'analyst', ('VIEWER', 'ANALYST')), 
    (Allow, 'viewer', ('VIEWER')), 
    DENY_ALL 
] 

關於你的第二個問題,你可以找到一個有用的功能在檢查權限pyramid.security模塊。

0

大多數權限系統都有用戶和組。如果您將組添加到您的情況中,則可以創建一個單獨的組,以添加所需的權限,然後添加想要擁有這些權限的用戶。您可以根據需要從組中添加和刪除用戶。

您也可以構建資源異常。例如,您可以將用戶列表添加到允許對其進行修改的資源,而不管它們可能具有哪些其他權限。