`
Tyler_Zhou
  • 浏览: 216971 次
  • 性别: Icon_minigender_1
  • 来自: 湖北->上海
社区版块
存档分类
最新评论

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[
		SELECT
			COUNT(*) AS COUNT_VALUE
		FROM
			Groups_Roles
		INNER JOIN
			Roles_Permissions ON
				(Roles_Permissions.roleId = Groups_Roles.roleId)
		INNER JOIN
			Permission_ ON
				(Permission_.permissionId = Roles_Permissions.permissionId)
		WHERE
			([$PERMISSION_IDS$]) AND
			([$GROUP_IDS$])
	]]>
</sql>

   

     B:Group Permission: 分配给Group(包括Community/Organization/User Group三类Group)的权限
Is the user associated with groups or organizations that are directly connected to one of the permissions?

 

<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByGroupsPermissions">
	<![CDATA[
		SELECT
			COUNT(*) AS COUNT_VALUE
		FROM
			Permission_
		INNER JOIN
			Groups_Permissions ON
				(Groups_Permissions.permissionId = Permission_.permissionId)
		WHERE
			([$PERMISSION_IDS$]) AND
			([$GROUP_IDS$])
	]]>
</sql>

 

        C:User Role Permission: 分配给用户Regular类型角色的权限
Is the user connected to one of the permissions via user roles?

 

<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUsersRoles">
	<![CDATA[
		SELECT
			COUNT(*) AS COUNT_VALUE
		FROM
			Users_Roles
		INNER JOIN
			Roles_Permissions ON
				(Roles_Permissions.roleId = Users_Roles.roleId)
		INNER JOIN
			Permission_ ON
				(Permission_.permissionId = Roles_Permissions.permissionId)
		WHERE
			([$PERMISSION_IDS$]) AND
			(Users_Roles.userId = ?)
	]]>
</sql>

   

        D:User Group Role Permission: 用户加Group(Community/Organization)所拥有该社区角色的权限
Is the user connected to one of the permissions via user group roles?

 

<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUserGroupRole">
	<![CDATA[
		SELECT
			COUNT(*) AS COUNT_VALUE
		FROM
			UserGroupRole
		INNER JOIN
			Roles_Permissions ON
				(Roles_Permissions.roleId = UserGroupRole.roleId and UserGroupRole.groupId = ?)
		INNER JOIN
			Permission_ ON
				(Permission_.permissionId = Roles_Permissions.permissionId)
		WHERE
			([$PERMISSION_IDS$]) AND
			(UserGroupRole.userId = ?)
	]]>
</sql>

 

E:User Permission: 直接分配给user的权限
Is the user directly connected to one of the permissions?

 

<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUsersPermissions">
	<![CDATA[
		SELECT
			COUNT(*) AS COUNT_VALUE
		FROM
			Permission_
		INNER JOIN
			Users_Permissions ON
				(Users_Permissions.permissionId = Permission_.permissionId)
		WHERE
			([$PERMISSION_IDS$]) AND
			(Users_Permissions.userId = ?)
	]]>
</sql>
 

     F:Role Permission: 分配给角色(包括Regular/Community/Organization三种类型角色)的权限
Is the user associated with a role that is directly connected to one of the permissions?

 

<sql id="com.liferay.portal.service.persistence.PermissionFinder.countByUsersPermissions">
	<![CDATA[
		SELECT
			COUNT(*) AS COUNT_VALUE
		FROM
			Permission_
		INNER JOIN
			Users_Permissions ON
				(Users_Permissions.permissionId = Permission_.permissionId)
		WHERE
			([$PERMISSION_IDS$]) AND
			(Users_Permissions.userId = ?)
	]]>
</sql>
 

讲完了这check权限的分类,我们现在开始讲liferay的权限策略
Algorithm 1. A or B or C or D or E
Algorithm 2. A and B and C and D and E
Algorithm 3. B or E or F
Algorithm 4. B and E and F
Algorithm 5. F

     注意:liferay推荐使用第五种是因为他效率最高,第一、二种是不可能会用到的,因为那是早期版本的设计,有些表例如:Groups_Roles都已经放弃了。如果不是必须不要去修改策略。

     现在说说他的缺点:用过权限开发的人都会发现,他的权限粒度很高,这样带来了一个问题就是效率会变低(虽然他用了大量的cache),最讨厌的是liferay权限体系总是,先把数据全搜索出来,当你要进行操作(VIEW)时,他才会跳出个红框框告诉你,你没有权限,这样很不友好。最典型的是list分页,点其中一条才会告诉你没权限,客户居然投诉:说我们有诱导之嫌。liferay现有的api是肯定做不到直接搜索出合法数据,虽然liferay在有的元素的service层,先把数据全取出来然后再一个一个的过滤来达到这样的效果,这样我觉得实在无法容忍,为了一页20条的数据,你居然要搜索出所有数据。为此我在项目中专门写了一个类,把一些共用的权限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();
	}

 

      注意:我们到的是策略3,所以我分别写了B,E,F权限SQL,及一个总的Algorithm3SQL,这些SQL返回的都是你要搜索元素的key,这些SQL在liferay中是通用的,只要你是用的liferay的权限他都是合适的,你要把他放在你sql合适的位置,注意最好不要使用in,这样效率是比较低的。

  • 大小: 33.6 KB
分享到:
评论
3 楼 surpass_li 2010-07-23  
太好了,研究的很到位呀
2 楼 yueyangflash 2010-02-01  
请问下liferay的权限控制 是否是一个独立的组件(权限是否是以组件的形式存在于liferay中)!
如果我们要用自己的权限框架实现,能否将liferay的权限全部拿掉?

谢谢!
1 楼 camelwoo 2009-12-03  

相关推荐

    Liferay6.1 权限管理

    - **安全性和扩展性**:二次开发可以帮助企业根据自身需求定制更高级的安全策略和权限模型,增强系统的安全性和灵活性。 总之,Liferay 6.1 的权限管理功能为用户提供了一个强大而灵活的工具,使得管理员能够在复杂...

    Liferay权限开发总结

    在Liferay权限开发中,权限模型是核心概念之一。Liferay定义权限为针对特定资源的操作行为,这使得系统能够判断用户是否被授权执行特定动作。资源(Resource)是权限系统中的基本元素,它可以是Portlet、Page、...

    Liferay Portal 创建权限

    对于高级用户而言,理解Liferay权限框架的深层次原理将有助于优化权限管理策略: 1. **社区与企业权限的区别**:社区权限通常限制在一个特定的社区范围内,而企业权限则适用于整个组织层级。例如,企业权限可以视为...

    Liferay权限结构

    3. **角色(Role)**:权限的集合,一个角色可以包含多个资源的多种权限,形成权限策略。 4. **用户(User)**:拥有权限的个体。 5. **组织(Organization)**:用户和资源的分组结构,可以是公司、部门等。 6. **地区...

    Liferay Portal权限介绍1

    总之,Liferay Portal的权限管理系统是一个复杂但强大的工具,通过合理配置角色、用户、组织、地点和社区等元素,可以实现灵活多变的安全策略,满足各种规模企业的个性化需求。理解这些核心概念对于充分利用Liferay ...

    liferay_permissions.rar_liferay

    "liferay_permissions.rar_liferay"这个压缩包可能包含的就是Liferay权限系统的数据库结构图,这对于理解Liferay的权限管理机制至关重要。 Liferay的权限系统基于Spring Security(原Acegi Security)框架,采用ACL...

    liferay经典书籍8本

    这本指南主要面向Liferay管理员,讲解了系统设置、用户管理、权限控制、性能优化和故障排查等方面的知识。通过阅读,你可以掌握如何高效地管理和维护Liferay环境。 3. 《Liferay Portal 7.x Clustering and High ...

    Liferay合集.zip

    7. **安全与权限**:掌握Liferay的安全模型,包括用户认证、授权和权限控制。 8. **性能优化**:学习如何调整Liferay的配置以提高系统性能,包括缓存策略、数据库调优等。 9. **API与插件开发**:熟悉Liferay的...

    liferay快速入门quickstart

    - **用户管理:**Liferay提供了全面的用户管理工具,包括用户账户创建、权限分配等功能,便于组织对访问者和内部员工进行有效管理。 - **主题更换:**通过Liferay的外观管理功能,用户能够自定义网站的主题和布局,...

    liferay-developer-guide-6.0_liferay_

    开发者需要理解角色、权限、资源的概念,以及如何为portlet设置安全策略。这将确保你的应用能根据用户的权限提供适当的功能。 Liferay还支持工作流和内容管理,你可以通过流程定义语言(BPMN)设计复杂的业务流程,并...

    Liferay开发文档整理.pdf

    Liferay的安全框架允许实现细粒度的安全策略,包括角色管理、权限分配和资源保护。 ### Liferay 资产框架和资产发布 Liferay的资产框架(Asset Framework)是用于管理内容和媒体的完整生命周期。通过资产框架,...

    liferay

    ##### 2.2 Liferay Portal 的用户策略 - **定义用户**:用户是 Liferay 中的基本身份单位,可以定义用户名、密码等信息。 - **添加用户**:通过 Liferay 的管理界面或 API 创建新用户。 - **修改用户**:更新用户的...

    liferay教程

    此外,Liferay还支持SSO(Single Sign-On)和LDAP集成,以便于企业进行身份验证和权限管理。 在实际应用中,Liferay的自定义开发是必不可少的。开发者可以通过编写Java Portlets、JSR-286 Portlets或者Freemarker...

    LIferay6开发书籍

    其次,《Liferay 用户开发接口》深入解析了Liferay中的用户管理和权限控制机制。这包括用户账户的创建、管理,角色和组的设定,以及基于角色的访问控制(RBAC)。开发者将了解到如何定制用户界面,实现个性化用户...

    LIFERAY的ppt课件

    5. **User Management**:强大的用户管理和权限系统,支持角色分配和细粒度的访问控制。 6. **Social Collaboration**:包括讨论论坛、博客、文档库和任务管理等工具,鼓励团队合作。 **学习路径** 对于Liferay...

    liferay 6.0 开发指南

    在《Liferay 6.0 开发指南》中,首先介绍了Liferay 6.0的核心技术及其开发策略。Liferay是一款强大的开源门户平台,支持企业级应用的构建与部署。该版本(6.0)在社区版的基础上提供了更多的功能和改进,特别是在...

    liferay portal 开发实例

    7. **资源权限**:Liferay支持细粒度的资源权限控制,开发者可以为portlet定义不同级别的访问权限。 8. **主题和布局**:Liferay提供了一套强大的主题和布局系统,开发者可以自定义portlet的外观和页面布局。 9. *...

    liferay development 中文

    这涉及到缓存策略、数据库查询优化、页面加载速度提升等方面,开发者需要熟悉Liferay的性能调优工具和最佳实践。 通过深入学习以上知识点,并结合《Liferay Custom Development 中文》提供的指导,开发者能够熟练地...

    Liferay开发指南(中文)和liferay详细介绍(英文)

    5. **权限和角色管理**:学习Liferay的安全模型,如何设置用户权限和分配角色,确保数据和资源的安全访问。 6. **社交和协作功能**:探讨Liferay的社区和协作工具,如论坛、博客、文档库等,这些都是促进团队合作的...

    liferay + cas + ldap 集成配置

    这涉及到配置 Liferay 的 CAS 客户端插件,设置 CAS 服务器的相关参数,以及调整 Liferay 的安全策略。 5. **集成 Liferay 和 LDAP**:Liferay 可以与 LDAP 服务器进行集成,用于用户身份验证和授权。这包括在 ...

Global site tag (gtag.js) - Google Analytics