在portlet中都有portlet.xml,我们都可以看到下面关于安全设定对应的代码:
- ..
- <security-role-ref>
- <role-name>administrator</role-name>
- </security-role-ref>
- <security-role-ref>
- <role-name>guest</role-name>
- </security-role-ref>
- <security-role-ref>
- <role-name>power-user</role-name>
- </security-role-ref>
- <security-role-ref>
- <role-name>user</role-name>
- </security-role-ref>
- ..
其实,很多人包括我在内有个疑问,就是有些portlet就算没有设定<security-role-ref>中role-name为guest,当时当这个portlet添加到页面上,照样可以被role为Guest的人看到(比如未登录用户)看到,这是为什么呢?
我后来去查阅了下liferay-in-action这本书,在P154对应4.5小节《Programmitic Security》中,可以看到,只有当在代码中使用编程式的访问控制时候(比如isUserInRole()),才会去读portlet.xml中的<sercurity-role-ref>,然后去liferay-portlet.xml中吧角色声明和Liferay服务器上具体的角色定义绑定。这是唯一的使用<security-role-ref>元素的地方。所以,其他地方比如Guest用户是否能查看等,完全和这个元素设定无关。
读取这个元素的代码在PortletLocalServiceImpl类的第1853行,同时开发框架的人变量名字写错了:
- ..
- Set<String> unlikedRoles = portletModel.getUnlinkedRoles();
- for (Element roleElement :
- portletElement.elements("security-role-ref")) {
- unlikedRoles.add(roleElement.elementText("role-name"));
- }
- ..
这里 unlikedRoles 应该是 unlinkedRoles ,否则你会怎么想都想不通这个变量的名字。
然后关联portlet.xml的角色声明到liferay-portlet.xml的代码在PortletImpl类的linkRoles()方法中:
- /**
- * Link the role names set in portlet.xml with the Liferay roles set in
- * liferay-portlet.xml.
- */
- public void linkRoles() {
- List<String> linkedRoles = new ArrayList<String>();
- Iterator<String> itr = _unlinkedRoles.iterator();
- while (itr.hasNext()) {
- String unlinkedRole = itr.next();
- String roleLink = _roleMappers.get(unlinkedRole);
- if (Validator.isNotNull(roleLink)) {
- if (_log.isDebugEnabled()) {
- _log.debug(
- "Linking role for portlet [" + getPortletId() +
- "] with role-name [" + unlinkedRole +
- "] to role-link [" + roleLink + "]");
- }
- linkedRoles.add(roleLink);
- }
- else {
- _log.error(
- "Unable to link role for portlet [" + getPortletId() +
- "] with role-name [" + unlinkedRole +
- "] because role-link is null");
- }
- }
- String[] array = linkedRoles.toArray(new String[linkedRoles.size()]);
- Arrays.sort(array);
- setRolesArray(array);
- }