martes, 30 de octubre de 2012

Liferay:Personalizar Acceso al panel de control

Anteriormente creamos un portlet y lo pusimos al a panel de control (Ver poner portlet en panel de control) esto hace que por defecto un usuario con el rol administrador podra ver dicho portlet en el panel de control.

Ahora queremos que un usuario con un rol diferente al de Administrador pueda ver el portlet en su panel de control, para ello haremos unas configuraciones propias:

Lo primero que debemos hacer es agregar una linea adicional al liferay-portlet.xml donde configuramos anteriormente para que nuestro portlet se despliegue en el panel de control, agregando el tag control-panel-entry-class justo debajo del tag control-panel-entry-weight quedando de la siguiente manera:





<control-panel-entry-category>content</control-panel-entry-category>
  <control-panel-entry-weight>3.0</control-panel-entry-weight>
  <control-panel-entry-class>com.ext.portlet.SimplePortletControlPanel</control-panel-entry-class>
  <instanceable>false</instanceable>


Donde la etiqueta control-panel-entry-class nos indica la clase que administrara el acceso de nuestro portlet al panel de control, por defecto es la clase generica del portal para nuestro caso modificaremos esta clase para darle el acceso a un rol personalizado usaremos una clase llamada SimplePortletControlPanel que extendera de la clase BaseControlPanelEntry para modificar los accesos, usaremos para ello la sobreescritura del metodo isVisible para que retorne true cuando estemos con el rol asignado:

package com.ext.portlet;

import com.liferay.portal.model.Portlet;
import com.liferay.portal.security.permission.PermissionChecker;
import com.liferay.portal.service.RoleLocalServiceUtil;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portlet.BaseControlPanelEntry;

public class SimplePortletControlPanel extends BaseControlPanelEntry{

 @Override
 public boolean isVisible(PermissionChecker arg0, Portlet arg1)
   throws Exception {
  // TODO Auto-generated method stub
  boolean isRedactor=UserLocalServiceUtil.hasRoleUser(RoleLocalServiceUtil.getRole(arg1.getCompanyId(), "Redactor").getRoleId(),arg0.getUserId());
  if(isRedactor){
   return true;
  }else{
   return false;
  }
  
 }
 

}


Este ejemplo queremos que el rol denominado "Redactor" pueda ver el portlet en su panel de control para ello se obtiene dicho rol y se valida si el usuario actual tiene dicho rol para que pueda ver el portlet en su panel de control.

Al hacer este cambio aparecera un error en el log (Ver log completo) :

ERROR [AdvancedPermissionChecker:384] com.liferay.portal.NoSuchResourceActionException: adminDemo_WAR_adminDemoportlet#ACCESS_IN_CONTROL_PANEL


Para solucionar esto se debe n hacer algunas configuraciones:
1.-Crear una carpeta llamada resource-actions en el src del proyecto.
2.-Crear un archivo xml llamado default.xml y ponerlo dentro de la carpeta creada recientemente:

<?xml version="1.0" encoding="UTF-8"?>

<resource-action-mapping>
    <portlet-resource>
        <portlet-name>adminDemo</portlet-name>
        <supports>
         <action-key>ADD_TO_PAGE</action-key>
            <action-key>ACCESS_IN_CONTROL_PANEL</action-key>
            <action-key>CONFIGURATION</action-key>
            <action-key>VIEW</action-key>
        </supports>
        <community-defaults>
            <action-key>VIEW</action-key>
        </community-defaults>
        <guest-defaults>
            <action-key>VIEW</action-key>
        </guest-defaults>
        <guest-unsupported>
            <action-key>ADD_TO_PAGE</action-key>
            <action-key>ACCESS_IN_CONTROL_PANEL</action-key>
            <action-key>CONFIGURATION</action-key>
        </guest-unsupported>
    </portlet-resource>
</resource-action-mapping>

Donde adminDemo es el nombre del portlet actual que se obtiene de su etiqueta portlet-name similar del archivo liferay-portlet.xml.
3.-Crear un properties llamado portlet.properties y tambien ponerlo en el src del proyecto conteniendo :

resource.actions.configs=resource-actions/default.xml

Desplegamos y el error habra desaparecido.

Estructura Final

No hay comentarios:

Publicar un comentario