2011-10-24 112 views
8

我真的不知道ACL如何工作。我知道這很酷,可以節省我很多時間和痛苦。但是目前我有點失落。金字塔的所有示例都使用遍歷。我專門使用URL調度。我不確定要了解如何構建資源樹結構。沒有遍歷的金字塔ACL

這裏是一個代碼示例:

class QuestionFactory(object): 

    def __init__(self, request): 
     self.__acl__ = default[:] 
     self.uid = authenticated_userid(request) 

     self.qid = request.matchdict.get('id') 
     if self.qid: 
      self.question = request.db.questions.find_one({'_id': ObjectId(self.qid)}) 
      if str(self.question.get('owner')) == self.uid: 
       self.__acl__.append((Allow, userid, 'view'))  

的事情是,它的工作原理。但是我必須爲每種類型的資源定義一個新工廠。我不確定我應該如何知道我試圖訪問槽URL調度和工廠的哪些資源。我會看到類似的東西

/accounts/{account} //Owners only but viewable by anyone 
/messages/{message} //Owners only 
/configs/{config}  //Admin only 
/pages/{page}   //Admins only but viewable by anyone 

,在這裏說我有這樣的結構

Root -\ 
     +-- account 
     +-- message 
     +-- config 
     +-- page 

每個工廠都有自己特殊的ACL。另一件事是/帳戶是主頁面。它沒有一個ID或任何東西。 /賬戶/新也是一個特例。這不是一個id,而是創建一個新項目的觀點。

我對GET/PUT/DELETE/POST要求使用了一種寧靜的風格。我不太確定我應該如何將url與資源匹配,並自動匹配正確的acl。如果我在我的根上定義一個像上面這樣的特殊工廠,那就沒有問題了。

編輯

我沒有得到它的一些東西之外的工作。我終於認爲我明白遍歷的目的是什麼。例如我們有這個網址:/ comments/9494f0eda/new, /comments/{comment}/new

我們可能必須在我們的資源樹中甚至3個節點上使用節點。

RootFactory將首先被檢查,然後根據我們的遍歷。它會得到RootFactory的評論屬性,然後在「評論」評論廠CommentFactory的或者我不使用廠的字典在邁克爾

它的實例對象本身

的「新」的看起來非常像這樣:

class RessourceFactory(object): 
    def __init__(self, parent, name): 

     self.__acl__ = [] 
     self.__name__ = name 
     self.__parent__ = parent 

     self.uid = parent.uid 
     self.locale = parent.locale 
     self.db = parent.db 
     self.req = parent.req 

這是我的基礎資源對象。在每一步都將信息從父母複製到新的孩子..我當然可以冒充我的屬性..上下文。 父母 ._ 父母 _.uid但這並不是那麼好。

我沒有使用字典屬性的原因。我想補充,使其與

作品/評論

由於種種原因,它沒有創造我的CommentFactory但有沒有需要鑰匙沒有返回。

所以我的根廠差不多是這樣的:

class RootFactory(object): 

    def __init__(self, request): 
     self.__acl__ = default[:] 

     self.req = request 
     self.db = request.db 

     self.uid = authenticated_userid(request) 
     self.locale = request.params.get('locale', 'en') 

    def __getitem__(self, key): 

     if key == 'questions': 
      return QuestionFactory(self, 'questions') 
     elif key == 'pages': 
      return PageFactory(self, 'pages') 
     elif key == 'configs': 
      return ConfigFactory(self, 'configs') 
     elif key == 'accounts': 
      return AccountFactory(self, 'accounts') 

     return self 

如果項目不被發現,RootFactory返回本身如果沒有,它返回一個新的工廠。由於我的代碼基於Michael的代碼,因此Factory構造函數有第二個參數。我不確定如何保持它作爲QuestionFactory非常清楚處理「問題」,因此不需要在此處命名工廠。它應該已經知道它的名字。

class QuestionFactory(RessourceFactory): 
    def __init__(self, parent, name): 
     RessourceFactory.__init__(self, parent, name) 
     self.__acl__.append((Allow, 'g:admin', 'view')) 
     self.__acl__.append((Allow, 'g:admin', 'edit')) 
     self.__acl__.append((Allow, 'g:admin', 'create')) 
     self.__acl__.append((Allow, 'g:admin', 'delete')) 
     self.__acl__.append((Allow, Everyone, 'create')) 

    def __getitem__(self, key): 

     if key=='read': 
      return self 

     self.qid = key 
     self.question = self.db.questions.find_one({'_id': ObjectId(self.qid)}) 

     if str(self.question.get('owner')) == self.uid: 
      log.info('Allowd user %s' % self.uid) 
      self.__acl__.append((Allow, self.uid, 'view')) 
      self.__acl__.append((Allow, self.uid, 'edit')) 
      self.__acl__.append((Allow, self.uid, 'delete')) 

     return self 

所以這就是幾乎所有邏輯都會去的地方。在初始化我設置的ACL將爲/中的GetItem它將爲/問題/ {ID}/*工作問題工作

自從我回到自身,任何的GetItem過去,這RessourceFactory會除非我返回指向自身一些特殊情況的新工廠。這樣做的原因是我的上下文不僅僅是數據庫或對象中的對象。

我的上下文處理多個事物,比如用戶標識,區域設置等...當acl完成時,我有一個新的上下文對象可以使用。它刪除了視圖中的大部分邏輯。

我可以設置事件來查詢locale和uid,但它確實適合這裏。如果我需要任何新的東西,我只需編輯我的RootFactory和RessourceFactory以將它們複製到子工廠。

這樣,如果某些事情需要在所有視圖中改變,那麼根本就沒有冗餘。

回答

5

您似乎對某些對象/行級安全功能感興趣,只允許帳戶所有者查看其數據。我會引用你對我之前關於這個主題的SO回答,以及我一直在圍繞這個答案構建的URL Dispatch中的身份驗證教程。具體來說,您可能需要查看鏈接的github項目中的2.object_security演示以及將資源樹解釋爲我網站上呈現的html的一部分的文檔。

Pyramid authorization for stored items

https://github.com/mmerickel/pyramid_auth_demo

http://michael.merickel.org/projects/pyramid_auth_demo/

如果你瞭解這些資源的任何問題,我很樂意進一步此詳述。

+0

我不知道,我已經全部閱讀了。正如我在標題中所說的......我試圖在沒有遍歷的情況下實現這一點。我試了一次,它弄亂了我的路線,沒有任何工作。我不相信我也有任何樹狀圖。因爲我有頁面,消息等等,但沒有任何對象真的與另一個相關。所以這樣的事情/ foo/bar/baz對我說話不多。 –

+0

我做了一些測試,畢竟它可能工作......明天我會寫點東西,我必須在明天考試前睡覺。 –

+0

我給你的鏈接是使用URL調度...金字塔的身份驗證系統通過遍歷對象樹來分層次工作。這是ACLAuthorizationPolicy的工作原理。如果您「已經閱讀了所有內容」,我會感到驚訝,因爲我昨天晚上重新編寫了該演示,並且正在積極開展工作。 ;-) –