Liferay之权限.docx
《Liferay之权限.docx》由会员分享,可在线阅读,更多相关《Liferay之权限.docx(13页珍藏版)》请在冰豆网上搜索。
Liferay之权限
如何使用Liferay权限配置
当前的Liferay权限结构是从4.0版本开始的。
jsr168中基于role的权限设计只解决了开发技术层面,并没有和实际的应用关联起来。
在Liferay中权限设计有很大的扩展,并可在多个层次进行配置。
首先要解释的是Liferay的权限模型。
首先看一下Liferay的定义
Apermissionisdefinedasanactionactingonaresource
在Liferay中,权限作用是判断当前用户是否允许在Resource上进行某项操作(action)。
Resource代表着一个个的可操作的实体。
在Portal系统中,最直观的Resource就是一个个的Portlet。
但是由于应用的原因,在Portlet下还可以根据应用的功能再细分,最典型的就是MessageBoardPortlet下还分Category和Message两类Resource。
这些Resource是很直观的。
此外还存在一些特殊的Resource可以控制,比如每张Page也是Resource。
另外由于在Liferay中可以配置多个Community,每个Community都可以多次放置同一种Portlet作为多个Instance的,所以对于Resource又附加了Scope的概念。
Resource有三种Scope:
Enterprise、Community和Individual。
Enterprise代表整个Portal系统中的一类资源,Community需要指明是哪个Community下的一类资源,Individual则是独立的Resource。
举个例子,我们要定义一个Permission
View+MessageBoardTopic/Enterprise
上面的定义说明,“查看当前Portal系统中任一个MessageBoard的Topic”。
再举个例子
UpdateMessageBoardTopic/"Developer"CommunityScope
上面的定义说明,“修改Developer这个Community下的任一个MessageBoardTopic”。
在LiferayPortal中所有Portlet都会有默认的View/ConfigurationAction。
其他的Resource和Action都需要开发人员预先设计,并在代码中调用PermissionChecker检验当前用户是否拥有权限。
这是后话,今后在开发相关的文章中再讨论。
如果理解了上面关于Resource、Scope和Action,接下去我们就可以讨论Liferay中如何进行设置,将Permission和User联系起来从而将权限赋予某人。
首先说最简单的Individual类型的Resource的配置方法。
如果以管理员身份登录系统,那么在任何一个portlet的右上角都有一个齿轮图标,点击该图标后选择Permissions标签就可进行该portlet得配置。
假设我们以管理员身份登录后切换到supportCommunity,对MessageBoards权限进行配置。
新出现的页面第一排中如果选择Users、Organizations、Locations、UserGroups,下方还将出现Current和Available。
Current中是当前已经配置的结果,Available是可供选择的人员、机构的列表。
我们选择User->Available->TestHKG1上打钩。
点击UpdatePermissions。
将所有权限都选择到Current下。
配置后再查看Users->Current,现在TestHKG1已经在Current下了。
使用test.hkg.1@账户登录系统,可以看到Support下的MessageBoards上出现了配置图标。
而且有AddCategory按钮。
然后看一下如何配置其他scope的权限。
首先以管理员身份登录系统,将EnterpriseAdmin添加到页面上。
选择Roles,添加一个Role名称为SupportMBAdmin,选择Delegate。
在portlet列表中选择MessageBoards,随后将Configuration后的Scope选择为Community,Next->Available->选择Support->Finish。
随后使用SupportMBAdmin的assign,将TestHKG2选中。
使用test.hkg.2@账户登录系统,可以看到Support下的MessageBoards上出现了配置图标。
hkg.1和hkg.2有什么区别呢?
hkg.1获得的是Individual的Resource。
只有这个Portlet是可以允许他配置的。
hkg.2获得的是supportCommunity下任一个MessageBoards的配置权限。
最后要说明的是,个人页面上的Portlet的Permission配置是没有意义的。
因为其他人不能查看你的页面,也就无法配置了。
写得不错,不过liferay的权限更加强大,还有对model的权限配置,精确到单条记录
利用liferay对权限开发也比较容易,写法也很固定,大家可以试试
HOWTO:
liferay权限开发
(一)
权限控制是liferay4.0以后增加的新特性。
在liferay中开发权限是一件很容易的事情,基本上都是通过定义xml来实现。
首先,我们来看看给自己的portlet加上权限控制,主要要完成以下四步操作(DRAC):
1.Defineallresourcesandtheirpermissions.
先定义所有所需要的权限(包括portletresource和modelresource)
2.Foralltheresourcesdefinedinstep1,registerthemintothepermissionsystem.Thisisalsoknown
simplyas“addingresources.”
当定义完权限后,我们需要把权限的定义注册到权限系统中,即把权限相关信息保存到数据库中
3.Associatethenecessarypermissionstotheseresources.
把所需的permission关联到resources上
4.Checkpermissionbeforereturningresources.
在相应的位置加上权限检验的方法
在解析上面四个步骤以前,有两个定义是非常重要的:
1. Resource-在portal系统中,可以简单的认为Resource是一个个可以操作的实体对象。
举个例子:
一般resources包括portlets(如:
MessageBoards,Calendar,etc),java类(如:
MessageBoardTopics,CalendarEvents,etc)还有flies(如:
documents,images,etc)
2. Permission-一个个可运行的权限动作,都已经在resourcez中定义了。
举个例子:
“查看calendar的portlet”这个权限动作已经通过resource在liferay的权限系统中定义
下面来简单解析一下开发权限的四个步骤:
一.DefiningResourcesandActions
默认的权限定义的xml文件放portal/portal-ejb/classes/resource-actions中
我们来看看calendar的权限定义
xml代码
1.
2.
3.
4.
5. 8portlet-name>
6.
7.
8.
9. ADD_EVENTaction-key>
10.
11. CONFIGURATIONaction-key>
12.
13. VIEWaction-key>
14.
15. supports>
16.
17.
18.
19. VIEWaction-key>
20.
21. community-defaults>
22.
23.
24.
25. VIEWaction-key>
26.
27. guest-defaults>
28.
29.
30.
31. ADD_EVENTaction-key>
32.
33. guest-unsupported>
34.
35. portlet-resource>
36.
37.
38.
39. com.liferay.portlet.calendar.model.CalEventmodel-name>
40.
41.
42.
43. 8portlet-name>
44.
45. portlet-ref>
46.
47.
48.
49. DELETEaction-key>
50.
51. PERMISSIONSaction-key>
52.
53. UPDATEaction-key>
54.
55. VIEWaction-key>
56.
57. supports>
58.
59.
60.
61. VIEWaction-key>
62.
63. community-defaults>
64.
65.
66.
67. VIEWaction-key>
68.
69. guest-defaults>
70.
71.
72.
73. UPDATEaction-key>
74.
75. guest-unsupported>
76.
77. model-resource>
78.
79.resource-action-mapping>
80.
首先,我们的权限定义的rootElement为,所有的权限定义都必须包含在里面
接着,我们可以看到liferay的权限定义分和两种,portlet-resource中定义的,我们可以在这里看到,
主要可以控制portlet的查看,配置权限,还有就是可以控制按钮一类设置的权限
model-resource的权限控制到每条记录上
xml代码
1.
2.
3. VIEWaction-key>
4.
5.community-defaults>
这里告诉我们当一个community拥有这个portlet的时候所具有的权限。
1.
2.
3. VIEWaction-key>
4.
5.guest-defaults>
当guest用户可以看到这个portlet的时候默认具有的权限,这里都为查看。
1.
2.
3. ADD_EVENTaction-key>
4.
5.guest-unsupported>
这里为guest用户不提供的权限
上面的这些设置的权限都可以在运行的时候修改
ADD_EVENT这类的定义,都已经在ActionKeys中有对应的常量定义,在二次开发的时候可以继承这个类来加入自定义的权限内容
在定义完权限的resource后,我们需要在default.xml中加入对应的path
xml代码
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.resource-action-mapping>
Default.xml的路径在portal(-ext).properties中可以配置
resource.actions.configs=resource-actions/default.xml
完成的上述工作后,我们需要在liferay的权限系统中把这些信息注册到数据库中(待续)
Liferay的授权与内容管理
本节主要内容是Liferay的授权操作以及内容管理,在介绍授权早作的同时将结合上一篇的内容,探讨程序背后的执行流程,也会凸现出在进行自己的portlet开发时所要注意的权限相关代码,为portlet的开发打下基础。
liferay-portal-4.1.2的权限管理主要有2部分构成:
1.user的部门归属
2.对单个portlet的授权
超级用户登陆系统后,将进入超级用户的管理界面,管理界面总共有Guest、Private、CMS、Support四层组成,即在Myplace中的4种视图,现对其进行介绍.
Guest视图:
主要管理普通用户的所访问的主页内容,在此视图中可以管理展现在主页上的各个portlet,管理portlet中展现的内容以及portlet的展现形式以及方位。
Portlet的内容管理放在稍后的视图中详细讲解,portlet的方位以及显示形式后可以通过页面上直接的拖放进行设置。
默认情况下,我们所列的portlet就是匿名用户所看到的门户,在每个portlet的设置中,我们还看到了权限的设置,可以将这个portlet的配置,查看等权限(每个portlet的权限不相同,每个都有配置、查看权限,但是有个复杂的portlet如用户管理的就有更多的如添加用户、删除用户等权限)授予用户,这里权限的授予分6级,直接授予用户,授予组织、授予地点、授予用户群、授予社群和授予客人(用户群和社群是自定义的)。
Liferay的用户机制为公司—地点—组织—个人,所以授予某一高级的组,下挂的用户将都会自动获得权限。
在我的应用中,我将WIKI加入了门户首页,同时将察看与删除授予匿名用户,所以,首页就拥有了一个大家参与修改的区域WIKI了!
Private视图:
这个是超级用户的私人界面,这里特别分析了几个简单portlet的权限管理的实现。
HelloWorldPortlet。
位置Test->helloworld这个portlet是最简单的一个展示,而且仅仅只有view的功能,所以这个权限管理就是能否在用户的视图中显示就行了,代码中的权限代码无,只是由layout调用HelloWorldPortlet。
注:
这里是通过设置直接调用HelloWorldPortlet,没有经过Struts框架,所以代码直接继承GenericPortlet,不能由路径访问。
Announcements。
位置,这个portlet中访问路径由struts配置文件指定,这个portlet代码ViewAction继承PortletAction,PortletAction继承的是StrutsAction.在portlet.xml中,
view-action
/wiki/view
指定了这个portlet的view所调用的路径,portal容器会根据struts的配置调用指定的Action。
在进行action调用时,很显然通过了Liferay扩展的PortalRequestProcessor(上一篇提到),也就进行了权限检查。
配置Announcements的路径在liferay-portlet.xml中配置,为/announcements/edit_configuration,同样这也是一个struts路径,她的权限管理也同view一样,在PortalRequestProcessor中完成。
IFramePortlet。
这个portlet也是一个简单标签的使用例子。
在这个portlet中,与HelloWorldPortlet相同,也没有Struts的路径配置,而是直接在portlet.xml中定义了接受请求的Action,所继承的StrutsPortlet由于不是由strutsAction而是GenericPortlet扩展而来,所以在访问的时候没有通过PortalRequestProcessor,所以其内部明确调用了liferay的权限管理代码:
PermissionCheckerchecker=
PermissionThreadLocal.getPermissionChecker();
由上面我们所分析的几个简单的portlet来看,以后在进行portlet开发时有2种选择,当逻辑比较少时,我们可以象IFramePortlet一样,通过对StrutsPortlet的继承完成。
当业务逻辑比较复杂时(多个路径),采用Struts进行路径配置时,最好同Announcements一样,通过继承PortletAction来将自身开发的portlet纳入liferay的权限管理框架中。
CMS视图:
明显,这个层进行文档管理,用过Guest视图就可以知道门户的所有的新闻文章都在journal中进行管理,对它的使用网上有很多很有用的文章,多用几次也就熟悉了,强大的文本、图像编辑功能可以就近使用而不再用自己编码,肯定也是很愉快的了:
)
Support视图:
这个视图也是其他用户(非管理员用户)登陆后的定制页面,由管理员进行定制,主要操作和上面一致。
Liferay的权限结构(liferay版本4.3.3)
Liferay能对每个具体的portlet进行控制,也能对portlet内的实体对象进行权限控制。
Liferay中进行管理的资源分为两种:
Portlet资源和model资源。
通过liferay的管理portlet就可以可视化的实现portlet的权限管理。
如果要对portlet内的实体对象model进行管理,需要进行一些程序实现。
现以一个具体的实例来说明如何实现portlet内的model资源的权限管理:
一个报表的portlet,其中包含一个具体的报表列表。
我们需要对每个具体报表进行权限控制。
建表
首先报表需要保存在数据库中,为报表建立报表数据库。
根据liferay的开发过程,步骤如下:
在ext-impl文件夹下,新建service.xml,该xml文件描述报表数据表的字段信息,并指定对应的java对象。
设定
进入ext-impl目录,执行命令:
antbuild-service。
自动生成建表的sql语句,在ext\sql\portal-tables.sql中。
Copy该语句并执行,生成对应的表。
之后,liferay自动生成相应的java类和接口,根据xml文件的描述不同,生成的类会有差别,主要有如下类:
实体类,Reports
持久类,ReportsPersistence,ReportsPersistenceImpl,ReportsUtil。
LocalService类,ReportsLocalServiceImpl,ReportsLocalService,
ReportsLocalServiceUtil。
.
Service类,ReportServiceImpl,ReportsService,ReportServiceUtil。
配置权限
针对portlet和报表对象,进行权限声明。
在ext-impl\resource-actions目录下,建立report.xml文件。
在该文件中,配置resource-action-mapping中的portlet-resource和
mode