在portlet中都有portlet.xml,我们都可以看到下面关于安全设定对应的代码:

 
  1. .. 
  2. <security-role-ref> 
  3.             <role-name>administrator</role-name> 
  4.         </security-role-ref> 
  5.         <security-role-ref> 
  6.             <role-name>guest</role-name> 
  7.         </security-role-ref> 
  8.         <security-role-ref> 
  9.             <role-name>power-user</role-name> 
  10.         </security-role-ref> 
  11.         <security-role-ref> 
  12.             <role-name>user</role-name> 
  13.         </security-role-ref> 
  14. .. 

其实,很多人包括我在内有个疑问,就是有些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行,同时开发框架的人变量名字写错了:

 
  1. .. 
  2.   
  3.  
  4. Set<String> unlikedRoles = portletModel.getUnlinkedRoles(); 
  5.  
  6.   
  7.  
  8. for (Element roleElement : 
  9.  
  10. portletElement.elements("security-role-ref")) { 
  11.  
  12.   
  13.  
  14. unlikedRoles.add(roleElement.elementText("role-name")); 
  15.  
  16. .. 

这里 unlikedRoles 应该是 unlinkedRoles ,否则你会怎么想都想不通这个变量的名字。

 

然后关联portlet.xml的角色声明到liferay-portlet.xml的代码在PortletImpl类的linkRoles()方法中:

 
  1. /** 
  2.  
  3. * Link the role names set in portlet.xml with the Liferay roles set in 
  4.  
  5. * liferay-portlet.xml. 
  6.  
  7. */ 
  8.  
  9. public void linkRoles() { 
  10.  
  11. List<String> linkedRoles = new ArrayList<String>(); 
  12.  
  13.   
  14.  
  15. Iterator<String> itr = _unlinkedRoles.iterator(); 
  16.  
  17.   
  18.  
  19. while (itr.hasNext()) { 
  20.  
  21. String unlinkedRole = itr.next(); 
  22.  
  23.   
  24.  
  25. String roleLink = _roleMappers.get(unlinkedRole); 
  26.  
  27.   
  28.  
  29. if (Validator.isNotNull(roleLink)) { 
  30.  
  31. if (_log.isDebugEnabled()) { 
  32.  
  33. _log.debug( 
  34.  
  35. "Linking role for portlet [" + getPortletId() + 
  36.  
  37. "] with role-name [" + unlinkedRole + 
  38.  
  39. "] to role-link [" + roleLink + "]"); 
  40.  
  41.  
  42.   
  43.  
  44. linkedRoles.add(roleLink); 
  45.  
  46.  
  47. else { 
  48.  
  49. _log.error( 
  50.  
  51. "Unable to link role for portlet [" + getPortletId() + 
  52.  
  53. "] with role-name [" + unlinkedRole + 
  54.  
  55. "] because role-link is null"); 
  56.  
  57.  
  58.  
  59.   
  60.  
  61. String[] array = linkedRoles.toArray(new String[linkedRoles.size()]); 
  62.  
  63.   
  64.  
  65. Arrays.sort(array); 
  66.  
  67.   
  68.  
  69. setRolesArray(array); 
  70.  
  71.  
  72.