权限配置文件中:
<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.
<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.