我真的不知道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以將它們複製到子工廠。
這樣,如果某些事情需要在所有視圖中改變,那麼根本就沒有冗餘。
我不知道,我已經全部閱讀了。正如我在標題中所說的......我試圖在沒有遍歷的情況下實現這一點。我試了一次,它弄亂了我的路線,沒有任何工作。我不相信我也有任何樹狀圖。因爲我有頁面,消息等等,但沒有任何對象真的與另一個相關。所以這樣的事情/ foo/bar/baz對我說話不多。 –
我做了一些測試,畢竟它可能工作......明天我會寫點東西,我必須在明天考試前睡覺。 –
我給你的鏈接是使用URL調度...金字塔的身份驗證系統通過遍歷對象樹來分層次工作。這是ACLAuthorizationPolicy的工作原理。如果您「已經閱讀了所有內容」,我會感到驚訝,因爲我昨天晚上重新編寫了該演示,並且正在積極開展工作。 ;-) –