liferay 权限策略
先上一张大家都很熟悉的图
这张图可以说是整个liferay的核心,他和权限密不可分,在权限体系里,每一个箭头和UI设置和API一一对应,今天讲权限,不讲代码只讲理论。liferay的权限策略分为五种,默认是采用第五种,因为第五种性能最好,如果要修改则在portal-ext.properies加上permissions.user.check.algorithm=3
讲策略之前我们先讲一下,liferay权限分为几种
A:Group Role Permission: 用户加入的Group(Community/Organization)所拥有的角色的权限
Is the user connected to one of the permissions via group or organization roles?
<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByGroupsRoles"><![CDATA[SELECTCOUNT(*) AS COUNT_VALUEFROMGroups_RolesINNER JOINRoles_Permissions ON(Roles_Permissions.roleId = Groups_Roles.roleId)INNER JOINPermission_ ON(Permission_.permissionId = Roles_Permissions.permissionId)WHERE([$PERMISSION_IDS$]) AND([$GROUP_IDS$])]]></sql>
<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByGroupsPermissions"><![CDATA[SELECTCOUNT(*) AS COUNT_VALUEFROMPermission_INNER JOINGroups_Permissions ON(Groups_Permissions.permissionId = Permission_.permissionId)WHERE([$PERMISSION_IDS$]) AND([$GROUP_IDS$])]]></sql>
<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUsersRoles"><![CDATA[SELECTCOUNT(*) AS COUNT_VALUEFROMUsers_RolesINNER JOINRoles_Permissions ON(Roles_Permissions.roleId = Users_Roles.roleId)INNER JOINPermission_ ON(Permission_.permissionId = Roles_Permissions.permissionId)WHERE([$PERMISSION_IDS$]) AND(Users_Roles.userId = ?)]]></sql>
<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUserGroupRole"><![CDATA[SELECTCOUNT(*) AS COUNT_VALUEFROMUserGroupRoleINNER JOINRoles_Permissions ON(Roles_Permissions.roleId = UserGroupRole.roleId and UserGroupRole.groupId = ?)INNER JOINPermission_ ON(Permission_.permissionId = Roles_Permissions.permissionId)WHERE([$PERMISSION_IDS$]) AND(UserGroupRole.userId = ?)]]></sql>
<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUsersPermissions"><![CDATA[SELECTCOUNT(*) AS COUNT_VALUEFROMPermission_INNER JOINUsers_Permissions ON(Users_Permissions.permissionId = Permission_.permissionId)WHERE([$PERMISSION_IDS$]) AND(Users_Permissions.userId = ?)]]></sql>
<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUsersPermissions"><![CDATA[SELECTCOUNT(*) AS COUNT_VALUEFROMPermission_INNER JOINUsers_Permissions ON(Users_Permissions.permissionId = Permission_.permissionId)WHERE([$PERMISSION_IDS$]) AND(Users_Permissions.userId = ?)]]></sql>
public static String getPrimkeyByRolePermission(long companyId, String name, int scope, String actionId, String roleIds){StringBuffer sql = new StringBuffer();sql.append("SELECT DISTINCT RESOURCE_.PRIMKEY FROM RESOURCE_ "+"LEFT JOIN RESOURCECODE ON (RESOURCE_.CODEID = RESOURCECODE.CODEID) "+"LEFT JOIN PERMISSION_ ON (PERMISSION_.RESOURCEID = RESOURCE_.RESOURCEID) "+"LEFT JOIN ROLES_PERMISSIONS ON (PERMISSION_.PERMISSIONID = ROLES_PERMISSIONS.PERMISSIONID) ");sql.append("WHERE RESOURCECODE.COMPANYID = "+ companyId +" " +"AND RESOURCECODE.NAME = '"+ name +"' AND RESOURCECODE.SCOPE = "+ scope +" ");sql.append("AND PERMISSION_.COMPANYID = "+ companyId +" AND PERMISSION_.ACTIONID = '"+ actionId +"' AND " +"ROLES_PERMISSIONS.ROLEID IN ("+ roleIds +")");return sql.toString();}public static String getPrimkeyByRolePermission(long companyId,String name, int scope, String actionId, long userId){StringBuffer sql = new StringBuffer();sql.append("SELECT DISTINCT RESOURCE_.PRIMKEY FROM RESOURCE_ "+"LEFT JOIN RESOURCECODE ON (RESOURCE_.CODEID = RESOURCECODE.CODEID) "+"LEFT JOIN PERMISSION_ ON (PERMISSION_.RESOURCEID = RESOURCE_.RESOURCEID) "+"LEFT JOIN USERS_PERMISSIONS ON (PERMISSION_.PERMISSIONID = USERS_PERMISSIONS.PERMISSIONID) ");sql.append("WHERE RESOURCECODE.COMPANYID = "+ companyId +" " +"AND RESOURCECODE.NAME = '"+ name +"' AND RESOURCECODE.SCOPE = "+ scope +" ");sql.append("AND PERMISSION_.COMPANYID = "+ companyId +" AND PERMISSION_.ACTIONID = '"+ actionId +"' AND " +"USERS_PERMISSIONS.USERID = " + userId) ;return sql.toString();}public static String getPrimkeyByGroupPermission(long companyId,String name, int scope, String actionId, long userId, long groupId){StringBuffer sql = new StringBuffer();sql.append("SELECT DISTINCT RESOURCE_.PRIMKEY FROM RESOURCE_ "+"LEFT JOIN RESOURCECODE ON (RESOURCE_.CODEID = RESOURCECODE.CODEID) "+"LEFT JOIN PERMISSION_ ON (PERMISSION_.RESOURCEID = RESOURCE_.RESOURCEID) "+"LEFT JOIN GROUPS_PERMISSIONS ON (PERMISSION_.PERMISSIONID = GROUPS_PERMISSIONS.PERMISSIONID) +" +"LEFT JOIN USERS_GROUPS ON (GROUPS_PERMISSIONS.GROUPID = USERS_GROUPS.GROUPID) ");sql.append("WHERE RESOURCECODE.COMPANYID = "+ companyId +" " +"AND RESOURCECODE.NAME = '"+ name +"' AND RESOURCECODE.SCOPE = "+ scope +" ");sql.append("AND PERMISSION_.COMPANYID = "+ companyId +" AND PERMISSION_.ACTIONID = '"+ actionId +"' AND " +"GROUPS_PERMISSIONS.GROUPID = " + groupId +" AND " +"USERS_GROUPS.USERID = " + userId) ;return sql.toString();}public static String getPrimkeyByPermissionAlgorithm3(long companyId,String name, int scope, String actionId, long userId, long groupId){StringBuffer sql = new StringBuffer();sql.append("SELECT DISTINCT RESOURCE_.PRIMKEY ID FROM RESOURCE_, RESOURCECODE, PERMISSION_, ");sql.append("(");sql.append("SELECT ROLES_PERMISSIONS.PERMISSIONID FROM ROLES_PERMISSIONS " +"JOIN USERS_ROLES ON (ROLES_PERMISSIONS.ROLEID = USERS_ROLES.USERID) " +"WHERE USERS_ROLES.USERID = " + userId);sql.append(") AS R, ");sql.append("(");sql.append("SELECT USERS_PERMISSIONS.PERMISSIONID FROM USERS_PERMISSIONS " +"WHERE USERS_PERMISSIONS.USERID = " + userId);sql.append(") AS U, ");sql.append("(");sql.append("SELECT GROUPS_PERMISSIONS.PERMISSIONID FROM GROUPS_PERMISSIONS " +"JOIN USERS_GROUPS ON (GROUPS_PERMISSIONS.GROUPID = USERS_GROUPS.GROUPID) " +"WHERE USERS_GROUPS.GROUPID = " + groupId);sql.append(") AS G ");sql.append("WHERE RESOURCECODE.COMPANYID = "+ companyId +" " +"AND RESOURCECODE.NAME = '"+ name +"' AND RESOURCECODE.SCOPE = "+ scope +" ");sql.append("AND PERMISSION_.COMPANYID = "+ companyId +" AND PERMISSION_.ACTIONID = '"+ actionId + "' ") ;sql.append("AND RESOURCE_.CODEID = RESOURCECODE.CODEID "+"AND PERMISSION_.RESOURCEID = RESOURCE_.RESOURCEID ");sql.append("AND (PERMISSION_.PERMISSIONID = R.PERMISSIONID OR " +"PERMISSION_.PERMISSIONID = U.PERMISSIONID OR " +"PERMISSION_.PERMISSIONID = G.PERMISSIONID)" );return sql.toString();}