- 浏览: 216975 次
- 性别:
- 来自: 湖北->上海
最新评论
-
苹果超人:
我也遇到这个问题,我想在ConfigurationAction ...
杀千刀的PortletPreferences -
flago:
Liferay 的论坛设置的默认显示多少条帖子怎么设置??
liferay中vm中如何调用java类代码 -
ofdata:
遭遇此问题
杀千刀的PortletPreferences -
yaokaiwen99:
大哥求一个简单的flexigrid在liferay中应用的例 ...
Liferay异步提交 -
gaigai511225:
你好 插件环境那个url 具体怎么写 我照您的方式写了出错 ...
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,这样效率是比较低的。
评论
如果我们要用自己的权限框架实现,能否将liferay的权限全部拿掉?
谢谢!
发表评论
-
JSR 286 Portlet 的新特性,第 3 部分: Portlet 过滤器和 Portlet 窗口
2010-06-01 10:24 2488在 本系列 的 第 1 部分 简要回顾了JSR 1 ... -
JSR 286 Portlet 的新特性,第 2 部分: 资源服务、事件与共享呈现参数
2010-05-31 18:42 2201在本系列的 第 1 部分 简要回顾了 J ... -
JSR 286 Portlet 的新特性,第 1 部分: Portlet 2.0 新特性介绍
2010-05-31 17:55 2378本系列文章专门针 ... -
Session share
2010-05-14 12:18 0Tomcat Server.xml <Servi ... -
Liferay集群负载均衡配置
2009-10-30 11:14 4882先介绍一下项目系统的环境, Liferay Version: ... -
Liferay 集群部署
2009-10-30 00:00 0十二点了,明天断续 -
Liferay Portlet之间的通信
2009-10-29 19:12 5006从我做Liferay到现在,这个问题一直都存在着,直到最近我才 ... -
Liferay异步提交
2009-10-29 18:06 3395liferay的异步提交其实是非常简单的,他用的是json & ... -
Liferay异步刷新
2009-10-29 18:05 3171Liferay portlet异步刷新,分为两种情况。 ... -
准备开始整理半年来对lifeay新的学习成果
2009-10-29 18:04 1491有半年没有写过liferay的blog了,不过对life ... -
Ajax知识
2009-06-11 17:50 0<SCRIPT LANGUAGE=" ... -
改变Liferay Portal Context(让Liferay不在使用ROOT目录)
2009-05-25 22:46 1823在部署的时候如果遇到我们会遇到让liferay与其他的项目并存 ... -
velocity调用DB持久层,生成actionurl
2009-05-22 17:42 1173#set($hostelCacheService = $ser ... -
liferay 所有版本下载地址
2009-05-21 13:29 3205从1.7.5一直到现在的5.2.3,应有尽有。 htt ... -
liferay ldap配置与相关代码
2008-11-28 11:06 38201.下载LDAP server 并安装, liferay支 ... -
liferay 的加密技术(CRYPT,SHA,SSHA,MD2,MD5)
2008-11-27 15:59 4284package com.liferay.util; impo ... -
liferay openid配置与代码详解
2008-11-21 21:14 28241.liferay的openid的配置很简单的,先去 open ... -
liferay验证码认证
2008-08-27 15:26 2733生成验证码相关: /** * Copyright (c ... -
很烦,想站在阳台上大声的喊
2008-08-20 19:42 1794终于到回家了,好累, ... -
网络爬虫相关(自已记下来,怕以后忘记)
2008-08-16 13:15 1925package com.taobao.html; impor ...
相关推荐
- **安全性和扩展性**:二次开发可以帮助企业根据自身需求定制更高级的安全策略和权限模型,增强系统的安全性和灵活性。 总之,Liferay 6.1 的权限管理功能为用户提供了一个强大而灵活的工具,使得管理员能够在复杂...
在Liferay权限开发中,权限模型是核心概念之一。Liferay定义权限为针对特定资源的操作行为,这使得系统能够判断用户是否被授权执行特定动作。资源(Resource)是权限系统中的基本元素,它可以是Portlet、Page、...
对于高级用户而言,理解Liferay权限框架的深层次原理将有助于优化权限管理策略: 1. **社区与企业权限的区别**:社区权限通常限制在一个特定的社区范围内,而企业权限则适用于整个组织层级。例如,企业权限可以视为...
3. **角色(Role)**:权限的集合,一个角色可以包含多个资源的多种权限,形成权限策略。 4. **用户(User)**:拥有权限的个体。 5. **组织(Organization)**:用户和资源的分组结构,可以是公司、部门等。 6. **地区...
总之,Liferay Portal的权限管理系统是一个复杂但强大的工具,通过合理配置角色、用户、组织、地点和社区等元素,可以实现灵活多变的安全策略,满足各种规模企业的个性化需求。理解这些核心概念对于充分利用Liferay ...
"liferay_permissions.rar_liferay"这个压缩包可能包含的就是Liferay权限系统的数据库结构图,这对于理解Liferay的权限管理机制至关重要。 Liferay的权限系统基于Spring Security(原Acegi Security)框架,采用ACL...
这本指南主要面向Liferay管理员,讲解了系统设置、用户管理、权限控制、性能优化和故障排查等方面的知识。通过阅读,你可以掌握如何高效地管理和维护Liferay环境。 3. 《Liferay Portal 7.x Clustering and High ...
7. **安全与权限**:掌握Liferay的安全模型,包括用户认证、授权和权限控制。 8. **性能优化**:学习如何调整Liferay的配置以提高系统性能,包括缓存策略、数据库调优等。 9. **API与插件开发**:熟悉Liferay的...
- **用户管理:**Liferay提供了全面的用户管理工具,包括用户账户创建、权限分配等功能,便于组织对访问者和内部员工进行有效管理。 - **主题更换:**通过Liferay的外观管理功能,用户能够自定义网站的主题和布局,...
开发者需要理解角色、权限、资源的概念,以及如何为portlet设置安全策略。这将确保你的应用能根据用户的权限提供适当的功能。 Liferay还支持工作流和内容管理,你可以通过流程定义语言(BPMN)设计复杂的业务流程,并...
Liferay的安全框架允许实现细粒度的安全策略,包括角色管理、权限分配和资源保护。 ### Liferay 资产框架和资产发布 Liferay的资产框架(Asset Framework)是用于管理内容和媒体的完整生命周期。通过资产框架,...
##### 2.2 Liferay Portal 的用户策略 - **定义用户**:用户是 Liferay 中的基本身份单位,可以定义用户名、密码等信息。 - **添加用户**:通过 Liferay 的管理界面或 API 创建新用户。 - **修改用户**:更新用户的...
此外,Liferay还支持SSO(Single Sign-On)和LDAP集成,以便于企业进行身份验证和权限管理。 在实际应用中,Liferay的自定义开发是必不可少的。开发者可以通过编写Java Portlets、JSR-286 Portlets或者Freemarker...
其次,《Liferay 用户开发接口》深入解析了Liferay中的用户管理和权限控制机制。这包括用户账户的创建、管理,角色和组的设定,以及基于角色的访问控制(RBAC)。开发者将了解到如何定制用户界面,实现个性化用户...
5. **User Management**:强大的用户管理和权限系统,支持角色分配和细粒度的访问控制。 6. **Social Collaboration**:包括讨论论坛、博客、文档库和任务管理等工具,鼓励团队合作。 **学习路径** 对于Liferay...
在《Liferay 6.0 开发指南》中,首先介绍了Liferay 6.0的核心技术及其开发策略。Liferay是一款强大的开源门户平台,支持企业级应用的构建与部署。该版本(6.0)在社区版的基础上提供了更多的功能和改进,特别是在...
7. **资源权限**:Liferay支持细粒度的资源权限控制,开发者可以为portlet定义不同级别的访问权限。 8. **主题和布局**:Liferay提供了一套强大的主题和布局系统,开发者可以自定义portlet的外观和页面布局。 9. *...
这涉及到缓存策略、数据库查询优化、页面加载速度提升等方面,开发者需要熟悉Liferay的性能调优工具和最佳实践。 通过深入学习以上知识点,并结合《Liferay Custom Development 中文》提供的指导,开发者能够熟练地...
5. **权限和角色管理**:学习Liferay的安全模型,如何设置用户权限和分配角色,确保数据和资源的安全访问。 6. **社交和协作功能**:探讨Liferay的社区和协作工具,如论坛、博客、文档库等,这些都是促进团队合作的...
这涉及到配置 Liferay 的 CAS 客户端插件,设置 CAS 服务器的相关参数,以及调整 Liferay 的安全策略。 5. **集成 Liferay 和 LDAP**:Liferay 可以与 LDAP 服务器进行集成,用于用户身份验证和授权。这包括在 ...