星期四, 11月 20, 2008

權限物件大概完工

看看人家的玩具,我的玩具都好小啊(嘆),只是個普通的權限物件XDDDD

不過寫到現在終於把他給大概寫完了。和phpGACL不一樣的地方在於

1.可以定義超過三個樹,phpGACL相對而言最多就是ACO、ARO、AXO三棵。不過這可能不常用到就是,但用的好的話應該可以把每個tree的height都減少吧。而且phpGACL把ACO、ARO、AXO三個東西視為截然不同的三個概念,而我自己的物件把所有的東西都當成樹,這樣除了可以輕易的擴展超過三維以外,程式碼也相對精簡許多。Database的table design也可以簡化。一個表把所有的tree塞進去就好,table structure可以比phpGACL簡單很多。

2.強制使用快取,沒有快取的話物件會直接死給你看。包括樹節點的查訪和ACL的查詢全部都會自動寫到Cache,相對phpGACL只有cache ACL的找尋結果,樹節點的搜尋是沒有快取的。也就是說比SQL查詢的使用量的話我的物件應該可以贏XDDD。而且我的Cache已經設計成盡量non-invasive,只要把一個可以寫的目錄指定到我的物件,事情就可以正常運作,phpGACL相對而言還要依賴到其他的套件。

3.我的物件的Cache system是我自己寫的,一些API interface的tweaking後可以很精準的控制Cache的清空,比如ACL更新後自動把ACL相關的Cache全部輕掉,節點更新(比如從user這個tree砍掉John這個節點)後,也可以把對應的Cache全部清光(比如把John有關的Cache全部刪除),Cache過期的問題應該就好很多,也因為不大會過期可以放心大膽的用。

4.最重要的一點是我的物件可以用一次SQL找出很多的ACL。以Use case來說的話,使用者John登入以後可能會做很多事情,包括修改他自己的文章,嘗試管理系統頁面等....,權限物件就會常常要問到「John可以改文章嗎?」「John可以修改版面嗎?」等相關的問題。phpGACL的作法是一個問題要花掉一次SQL,但我自己的物件可以預先把所有John相關的權限,用一次SQL直接查詢好並且Cache起來。唯一的小缺點就是每次查詢就要跑一次迴圈,迴圈的時間長度和預先快取的ACL量成正比,但想必這比每個問題都要跑一次SQL快多了。理想狀況下,只要沒有人去動後面的ACL授權而且前端PHP設計的夠好,搞不好一個使用者一小時只要查一次SQL。

5.支援Group/ownership semantic,有時候用物件的擁有者屬性來表達權限,比user那邊加一個節點,可控制物件加一個節點,再加一個ACL設定某人可以存取某物件來的方便,特別是可以控制的物件非常多的時候。東西自己寫得改起來就是方便啊。old code要migration痛苦度也down...XD。

6.不只ARO可以有Group,其他的東西也可以有層級,這代表未註冊的使用者不必一個個加例外設定他不能幹嘛,直接把他丟到「未註冊」這個group,然後設定這個group不能做什麼就好了,大幅減少ACL的數量。那performance penalty呢?都說開Cache了,每次節點的搜尋都可以用Cache...XD

目前還是有一些缺點,比如少了可以快速產生編輯介面的API,這會導致我必須把物件的Internal working暴露給要寫權限編輯程式的人。不過這問題以後碰到再說。 全文連結

0 意見: