domingo, 7 de septiembre de 2008

Usar isAccessAllowed con BEA WLP10

Recientemente nos hemos visto en la necesidad de añadir seguridad en un portlet que se iba a desplegar en un portal Weblogic Portal 10. La modificación consistía en dar una funcionalidad concreta a un rol determinado dentro la aplicación.

Después de valorar diferentes alternativas, decidimos aplicar el tag isAccessAllowed de la taglib xmlns:auth="http://www.bea.com/servers/p13n/tags/auth" . Este tag proporciona la comprobación primaria para autorizar el acceso a recursos de WLP. Si el resultado de la comprobación es negativo, el cuerpo del tag no se renderiza.

Este tag espera los siguientes parámetros:
  • id. El nombre de la variable donde se almacena el resultado de la comprobación. Es de tipo booleano. Es obligatorio
  • resourceId. Representa la taxonomía definida para el recurso dentro de la aplicación. Es de tipo String y es obligatorio.
  • capability. Este no es obligatorio y representa el permiso concreto (view, edit, remove,...) que se quiere autorizar.
El problema de esta solución estaba en la construcción de la taxonomía del recurso que queríamos proteger (en este caso un portlet). No encontramos documentación de referencia de como construir esta cadena y tuvimos que investigar un poco hasta dar con la forma correcta.

Para construir el identificador de un recurso se debe concatenar los siguientes elementos:

Tipo_objeto + Etiqueta_de_portal + Etiqueta_de_desktop + Etiqueta_de_recurso

Donde:
  • Tipo_objeto es una constante: Portlet para los portlets y Page para las páginas.
  • Etiqueta_de_portal corresponde al Portal Path del portal.
  • Etiqueta_de_desktop es el Desktop Path del desktop donde está instanciado el portlet.
  • Etiqueta_de_recurso es el atributo Label de la instancia del portlet.
Todos estos valores se pueden obtener de forma bastante sencilla a partir de los elementos de presentación contextuales del portal. Por ejemplo:

<>
AppContext ac = AppContext.getAppContext(request);

AbstractButtonPresentationContext absBut =(AbstractButtonPresentationContext) pageContext.getAttribute("abstractbuttonpc");

StringBuffer resourceId = new StringBuffer("Portlet");

resourceId.append(EntitlementConstants.RESOURCE_ID_DELIMITER)
.append(ac.getPortalPath())
.append(EntitlementConstants.RESOURCE_ID_DELIMITER)
.append(ac.getDesktopPath())
.append(EntitlementConstants.RESOURCE_ID_DELIMITER)
.append(absBut.getWindowLabel());
< /jsp:scriptlet >

Además de a portlets y páginas, esta seguridad se puede aplicar a otro tipo de recursos siguiendo una nomenclatura similar.

Un posible inconveniente de esta solución estriba en el rendimiento, ya que el cálculo del resource id se hace a nivel de la capa de presentación. De todas formas, hay técnicas sencillas para evitar este problema.

No hay comentarios: