Jive筆記7 -- Jive的硬傷 (轉)

amyz發表於2007-08-15
Jive筆記7 -- Jive的硬傷 (轉)[@more@]Jive筆記7 -- Jive的硬傷

(1)Jive2.x顆粒度太粗,只是細分到Forum,所以其無法完成類似 貼/需要回復才能看見 這樣的功能。當

然,可以透過屬性操作,修補來實現,但這不是我們的目標。

(2)Jive2.x許可權規則:上級覆蓋下級。
舉例:有一個Category 1,everyone 可read,其下有forum 1,2,3,.....100個。
現在,我想讓forum2只讓註冊訪問,則你無法做到!
除非:刪除Category1的everyone read許可權,分別給forum1,3,4,5....100新增everyone read許可權,然後再給forum2設

置registed user read許可權。

(3)如果Category/Forum數量成百上千,Jive會大大降低。
Jive2.x在設計的時候就沒有考慮到這種情況,而許可權也只落實到Forum。在程式碼處理上,看Iterator.

public IteratorProxy(int type, Iterator iterator, Authorization authorization, ForumPessions permissions) { this.iterator = iterator; this.authorization = authorization; this.permissions = permissions;   // Load the appropriate proxy factory depending on the type of // that we're iterating through. Each proxy factory is responsible // for checking that the user has permission to view the object, and // then wrap it with an appropriate proxy. switch (type) { // CATEGORY case JiveGlobals.FORUM_CATEGORY: // Create a class that wraps forums with proxies. proxyFactory = new ProxyFactory() { public Object createProxy(Object obj, Authorization auth, ForumPermissions perms) { ForumCategory category = (ForumCategory)obj; // Create a new permissions object with the combination // of the permissions of this object and tempPermissions. int parentPerms = perms.toInt(); // Never inherit the show category permission. ForumPermissions newPerms = new ForumPermissions( ForumPermissions.setBit(parentPerms, ForumPermissions.SHOW_CATEGORY, false)); ForumPermissions catPerms = category.getPermissions(auth); newPerms = new ForumPermissions(catPerms, newPerms);   // Return the object if the user has permission. if (newPerms.get(ForumPermissions.READ_FORUM) || newPerms.get(ForumPermissions.SHOW_CATEGORY) || newPerms.get(ForumPermissions.MODERATE_MESSAGES) || newPerms.get(ForumPermissions.MODERATE_THREADS) || newPerms.get(ForumPermissions.FORUM_ADMIN) || newPerms.get(ForumPermissions.CATEGORY_ADMIN) || newPerms.get(ForumPermissions.SYSTEM_ADMIN)) { return new ForumCategoryProxy(category, auth, newPerms); } // Otherwise return null. else { return null; } } }; break;


分析:假設存在Category 1,2,3,4,5,其中Category2只允許註冊使用者訪問。現在是匿名訪問。則構造中傳入
的Iterator包含了全部的Category,在匿名類的createProxy()中判斷了許可權,如果編歷到category 2,毫無疑問會
返回null(這樣,category2被過濾了)。匿名類的createProxy()將被iteratorProxy的getNextElement(),程式碼如下


public Object getNextElement() { while (iterator.hasNext()) { Object element = proxyFactory.createProxy(iterator.next(), authorization, permissions); if (element != null) { return element; } } return null; }


這裡的while()將跳過被過濾的物件(其實是null物件咯),返回當前auth可見的Category物件。

再觀察ForumCategory介面,只有categories()方法,而沒有categories(ResultFilter),說明沒有做分頁處理。

如果我們新增分頁處理,得注意由於iteratorProxy的過濾,而導致實際得到的Category數目和page size的不一致。
比如:有30個Category,我一個categories(resultFilter)呼叫返回了15個,經過IteratorProxy的時候,被過濾掉了1個
這樣實際上只有14個Category了,這樣會讓JSP迷惑,覺得ResultFilter.setPageSize()不對了。


附:本來是很長的一篇筆記,花費了一個多小時,想不到提交表單的時候,IE崩潰了!欲哭無淚!查出來罪魁禍首是
superbar.dll,不知道是什麼垃圾,全面清剿中。。。。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958270/,如需轉載,請註明出處,否則將追究法律責任。

相關文章