liferay權限關於defaults權限的問題

權限配置文件中:
<community-defaults>
<action-key>VIEW</action-key>
</community-defaults>
<guest-defaults>
<action-key>VIEW</action-key>
</guest-defaults>
訪客和成員默認有了view權限,事實是否如此呢?回答:"不是".前幾天客戶反應新增加的產品訪客看不見,只有把權限更新一下才能看得見,每一個都要更新無法接受,仔細跟進ProductCategoryPermission.contains(permissionChecker, categoryEntry, ActionKeys.VIEW)這個方法發現,PermissionCheckerImpl.hasPermission這個方法中先調用
Boolean value = PermissionCacheUtil.hasPermission(
user.getUserId(), groupId, name, primKey, actionId);先看一下內存文件裏有沒有記錄(c:/{user}/liferay),如果你是第一次剛啓動他返回肯定是null,然後是
value = new Boolean(
hasPermissionImpl(groupId, name, primKey, actionId));最關鍵的就是這個方法了,如果你是訪客會調用hasGuestPermission,最終會調用PermissionServiceUtil.hasUserPermissions(
defaultUserId, guestGroup.getGroupId(), actionId, resourceIds,
bag);
代碼部分就說到這,感覺太多了說不完,他操作流程是先找到resourcecode這個表,取得CODEID,然後再找resource這個表,取得RESOURCEID,最後纔去找permission_這個表,找到permissionid後,再去用userId和permissionid去數據庫裏取得是否有權限,最後再把結果存到緩存文件裏,以後再做這個權限驗證他就不會走相同的路了,這一點是要注意的.
這樣就出現了一個問題,產品可能有幾萬條,只是其中的幾條不給訪客看,每一個都要設置的話那就是要人命了,於是在ProductCategoryPermission.contains方法加上
try{
ResourceServiceUtil.getResource(
companyId, CategoryEntry.class.getName(), ResourceImpl.SCOPE_INDIVIDUAL, String.valueOf(category.getCategoryId()));
}catch (NoSuchResourceException nsre) {
return true;
}剛加的實例在resource這個表裏是肯定沒有的,getResource方法會報一個NoSuchResourceException ,報了就返回true,如果不報錯就接着向下走,走liferay那一套,ResourceImpl.SCOPE_INDIVIDUAL這個值是設定範圍的,在取resourcecode這個表會用到,有四個值可選,感覺好像只會用到SCOPE_INDIVIDUAL.
OK,到這裏就結束了,再調用view驗證時候,他就會先找這個是否存在表中,不存在就返回true.
發佈了6 篇原創文章 · 獲贊 0 · 訪問量 2964
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章