Liferay 6.1开发学习(二十一):Liferay权限体系简介
Liferay的权限体系几经变动,不同的版本里面有不同的权限结构,现在的Liferay6.1.1版本里面的权限体系,可以算是经过多次进化的版本6,虽然权限体系有不同,但一些基础的概念还是通用的,在介绍Liferay权限体系之前,有一些基本的概念需要了解。
Liferay里面的常用概念
用户(Users)
Users代表系统的物理用户,是人们用来登录系统的用户账号。默认情况下,用户可以获得他们可以管理且具有公共和私有页面的私有站点,管理员可以关闭或者锁定该内容。但该私有空间很重要:让用户可以具有自己的公共blog或者私有的日历,个人文档存储等。
可以通过多种途径归集用户。他们可以是分层组织中的成员,例如Liferay中包含安全→因特网安全。用户可以归属于专门的用户群,例如博客群体,这样用户可以在他们的私人空间创建博客载体。他们也可以是有相同兴趣的站点当中的成员。用户也可以拥有自己的角色来描述他们在系统中的功能,这些角色的作用域可以使门户,组织,或者站点。
用户组(User Groups)
用户组是由管理员创建的简单、专属的用户集合。他们可以是站点或者角色中的成员。权限不能分配给用户组。尽管用户组不像其他的一些用户集合(例如站点或者组织)一样有页面集。但是它们具有可以用来定制用户私人页面集的页面模板。这在后面会详尽的描述。
角色(Roles)
Liferay有以下三种类型角色:
l 门户角色
l 组织角色
l 站点角色
这些叫做角色作用域。角色被用于在它的作用域范围内定义权限:作用于门户,作用于组织或者作用于站点。例如,考虑授权一个角色可以创建一个留言板,一个门户角色(Portal Role)允许在门户范围内访问,不管该留言板(Message Board)在门户的任何地方。一个站点角色仅授权用户对站点内的留言板有访问权限。一个组织角色也仅授权特定组织内的留言板有访问权限。
因为角色是严格用于门户安全的,因此它们不能像站点和组织一样拥有自己的页面。
用户、用户组、站点、组织都可以是角色的成员。
组织(Organizations)
组织是分层的用户集合,它是两类可以有页面的portal资源之一。这里也有一个叫做location的特殊组织,可以用于定义用户所处的特殊位置。
组织能够方便的定义用户在一个特殊层次关系中的位置。例如,如果你为一个大型企业实现了Liferay门户,通过Joe Smith在组织结构图中的位置,它就可以帮助定义Joe Smith用户。假如Joe Smith是位于新泽西州办公室的一个销售工程师,在东北部的销售部工作,那么他可能是以下组织的成员:
l 销售
l 东北部
l 新泽西州
现在,假如在每个用户的home page上都放置了一个名叫Asset Publisher的静态portlet(通过用户组(User Group)页面模版实现),此时,就可以通过内容管理系统将许多公告信息通知到员工。只要内容标记合适,可以确保Joe Smith获得所有在东北部或者新泽西州和销售有关的公告。
组织可以是站点的成员。
站点(Site)
站点是有共同兴趣的用户集合(在以前的版本中叫做社区),Liferay的默认页面是以门户名称命名的站点的一部分,因为不管是匿名用户还是门户用户,都有访问站点默认公共页面的需要。有三种不同类型的站点:
l 开放(open)
l 有限的(restricted)
l 私有的(hidden)
开放站点(默认)允许用户在任何时候都可以自由加入或者退出,使用控制面板或者一个站点的 portlet添加到他们可以访问的页面。有限站点中只有站点管理员可以增加用户。用户可以用Control Panel或者Site portlet申请用户.私有站点和有限站点类似,特别之处是他不会在Control Panel或者Site portlet里面显示。私有站点中必须是站点管理员才能增加用户。
团队(Teams)
Team在每个站点和组织中是独立存在的,Team本质上是在站点里面能够创建的用户集合。它和组织及站点角色不一样,Team仅仅出现在创建它的组织和站点里面。这对需要在一个站点或者组织里面为一些特殊目的创建一组用户但却不需要在门户中的每一个站点和组织中使用的情况非常有用。
Team同时也是某些应用场景中必不可少的,因为它们可以被站点或者组织管理员创建。站点和组织管理员不能创建角色,因此,通过team他们就可以在一定的级别进行权限管理,这是在没有Team之前做不到的。
各部分之间的关系
权限体系
资源
Liferay的权限体系也是基于角色的权限控制,但是在谈Liferay的权限之前,需要了解的一个概念就是资源,在Liferay中所有的一切都被看做是资源,和权限直接打交道的就只有资源。以下内容都可以看作是资源:
- Portlets:我们开发的portlet或者Liferay自带的Portlet(文档管理、公告、博客、WIKI)
- Java类:例如每一个实体类,如user、group,及这些实体产生的数据,如一个公告信息、一篇博客信息
- 文件:如一张图片、一个文档、一个视频等
- 一个字段:如添加的自定义字段的具体的一个字段等
- 其他:一个社区、一个站点、一个用户等
权限
权限是在资源上面的动作控制,如果View权限在某一个Portlet上面,则是表示拥有查看某一个Portlet的权限,也就是用户对Portlet这个资源可以执行查看的动作。
如对一个资源的查询、编辑、修改、删除等都是在这个资源的上的动作。
权限的存储
在Liferay里面存储权限的表主要涉及两个表,一个叫resourcepermission(资源权限表)。此表定义了Liferay里面权限结构,里面的表结构主要字段含义如下:
- Name:资源对象的描述,如果资源描述的是一个portlet对象,则为这个portlet对象的portletId.如果是一个class, 则为带包名的class全名称
- Scope:权限的作用域,值有1、2、3、4,1表示company级就是实例、2表示group级就是站点级,3是站点模板,4是没级,就表示当前的。
- Primkey:资源的ID
- Roleid:角色id
- Ownerid:资源的属于哪一个人,一般值为0或创建的用户id
- Actionids:这里的actionids为resourceaction表里面的bitwisevalue的值的相加之和。
这里重点字段有四个:Name确定资源的类型是portlet还是具体的modle还是其他的,primkey为资源的主键,我们通过资源类型和资源ID就确定了一个具体的资源(具体某一个portlet,具体某一张图片等),Roleid确定的是角色,actionids这个确定的是具体的有哪些可执行动作(查看、修改、删除等等)。
另外一张表为:resourceaction(资源动作表),此表定义了Liferay中的相应的资源上可执行的动作有哪些。主要的表结构字段如下:
- Name: 定义了资源的类型,同上面的表一样,确定资源是portlet还是实体或者是其他,表示是什么资源。
- actionId:可执行的动作名称,这里主要是为我们的动作启一个名称,如添加、修改、配置等。
- bitwisevalue:这个定义的为上面可执行动作的位值,也可以看作是权限的动作ID。
上面介绍完这两个表了,那确定一个权限的过程是什么呢?比如我们要判断某一个用户是否拥有welcome页面的查看(VIEW)权限:
- 根据用户,获取用户的角色,我们可以知道某一个用户拥有哪些角色。这一步应该没有啥疑问。
- 在资源权限表里面询name值为com.liferay.portal.model.Layout(表示页面的资源类型)的,primkey为页面的当前页面Id的。
- 现在有了角色、有了页面,要判断的就是这个角色是否有对这个页面的view的可执行动作。我们发现在资源动作表(resourceaction)里name为com.liferay.portal.model.Layout,actionid为VIEW地记录中bitwisevalue的值为1,则我们现在只需要判断资源权限表(resourcepermission)里面的actionids是不是有1组成的即可。那怎么判断呢?
我们来观察一下这两张表的结构:
在资源权限表里面actionids这个里面的,这个里面的值我们看到的如是3(=1+2),如果是9(=1+8),如果是258(2+256),如果观察就会发现这里面的值总是等于2的n次方的值相加的结果。我们再来看资源动作表resourceaction,发现里面的bitwisevalue的值是1、2、4、8、16、32等这样的值,总是2的n次方。
现在我们要判断的就是actionids的值是不是有某一个2的2次方,比如3这个值,我们只需要判断他的组成部分是不是有1。如果本示例中我们只需要判断view是的bitwisevalue的值是不是在actionids里面,这个判断我们使用位运算。如
3&1 = 0000 0011&0000 0001(二进制)=0000 0001(二进制)=1
上面这个太简单,现在我们判断7里面是否包含4
7&4 = 0000 0111&0000 0100 = 0000 0100 = 4
所以我们如果要判断bitwisevalue的值是否在actionids里面,只需要两个做位运算,actionids|bitwisevalue是否等于bitwisevalue即可。
本篇文章只是介绍了Liferay的权限体系,在下一篇文章中介绍如何使用Liferay的权限。
冷大,求下一篇啊,要做自定义权限了~~~~
Liferay权限体系简介2什么时候出啊,村头厕所没看的了
7|1 = 0000 0111|0000 0100 = 0000 0100 = 4 这里应该7|4,笔误了~
嗯,写错了,谢谢指正。
各部分之间的关系中第三张图(各部分的存储表)中,表的名词命名有什么规律吗,为什么是这样命名的,例如,用户跟社区的关系表叫Users_Groups,但是组织跟社区之间的关系表叫做Groups_Orgs,而不是统一叫Users_Groups,Orgs_Groups或者是Groups_Users,Groups_Orgs
谢谢!
这个我觉得貌似没有啥规律,说是组织跟社区的关系,我们也可以说是社区跟组织之间的关系,这个没有啥主次关系
恩 谢谢!
为什么说 尽管用户组不像其他的一些用户集合(例如站点或者组织)一样有页面集。 我在6.1.1的版本里面用户群组中有管理站点页面功能,这个站点指的不是当前的用户群组吗?
谢谢!~~~
用户组里面的站点准确来说是当前用户的私人页面,而不能像组织或站点一样是有独立的页页集,用户组里面设置的页面功能会自动的归集到此用户组下面用户的私人页面或公共页面中。
独立的页页集是说展示在前台的页面吗?
用户组里面设置的页面功能会自动的归集到此用户组下面用户的私人页面或公共页面中—请问一下这个归集的功能主要是什么作用呢,可以举个例子吗?测试了一下(6.1.1版本的)~~~
谢谢!
是的,就是在前台没有一个独立的站点集合,比如我们有一个A的用户组,但是在前台不会看到一个是A用户组的站点。用户组算是一种用户集,可以看作是另外一种权限。
谢谢!
为什么用户组的页面会被归集到用户组的用户当中呢,这个有什么作用吗?
liferay怎么给不同的角色分配不同的页面
胡总,你好,我看了很多你的文章,学习了很多知识,谢谢。
我最近碰到了一个问题,我想在控制面板——》角色——》定义权限——》应用程序中,修改某个portlet的权限,比如是我自己创建的OnePortlet。liferay为每个portlet都赋予了:“查看”、“添加到页面”等几个权限,我想在这里添加几个其他的权限,比如“老师”、“学生”权限。
从liferay的论坛中查了很多资料,但是都没有用,请问您可以帮我解决吗,非常感谢。