cancel
Showing results for 
Search instead for 
Did you mean: 

Dudas con Webscripts y permisos

ricard
Champ in-the-making
Champ in-the-making
Hola

Estoy desarrollando un proyecto donde Alfresco está como repositorio, hay una capa AJAX por encima y se accede al repositorio mediante WebScripts.
El "Single Sign-On" lo consigo mediante un JSP en la APP de Alfresco que me devuelve un ticket para el usuario demandado y ataco a los WebScripts con ese ticket como parametro.

Me estoy encontrando con los siguientes problemas/dudas y no encuentro mucha documentación al respecto:

- Detectar si el usuario en cuestión está definido como Admin o no.

En la API Java de Alfresco, existe la función authorityService.hasAdminAuthority() que te dice si el usuario logado es Administrador o no. ¿Existe algo parecido en la API JavaScript?

- Existen acciones que solamente se pueden realizar con una autoridad de Admin (cambiar permisos a un nodo que no eres OWNER, etc).

¿Existe alguna forma de en medio de un WebScript decirle "Ahora eres admin" (hay un ticket abierto en Alfresco pidiendo la función RunAs("admin")) para hacer esas acciones y seguir después con el usuario que llama al WebScript?
Una opción sería hacer dos webscripts, uno con las acciones de Admin (y que lógicamente debería llamarlo con un ticket con autoridad Admin) y otro con las acciones de cada usuario, pero preferiría la opción de cambiarlo en medio del script.

Mis dos "problemas" pueden hacerse mediante las APIs Java de Alfresco, pero no encuentro cómo hacerlo con la API Javascript. Son cosas que creo que son importantes y más si Alfresco va a tender a los WebScripts.

Espero haberme explicado correctamente y si alguien sabe la solución pues agradecería respuestas.

Gracias y saludos
2 REPLIES 2

ajv
Champ in-the-making
Champ in-the-making
Hola Ricard cuanto tiempo!  Smiley Tongue

Efectivamente desde el API Javascript no hay métodos que proporcionen la funcionalidad que pides.
Se me ocurren 2 soluciones:
1.- Extender tú mismo el API Javascript de Alfresco.
Para ello, tendrías que implementar una clase que extienda de org.alfresco.repo.processor.BaseProcessorExtension, y todos los métodos públicos que definas allí, serán accesibles desde Javascript.
Después se configura el bean de Spring, usando como bean padre baseJavaScriptExtension, y se le da en la propiedad extensionName el nombre que se utilizará como objeto de acceso:
    <bean id="customScript" parent="baseJavaScriptExtension" class="miPaquete.ScriptCustom">
        <property name="extensionName">
            <value>custom</value>
        </property>
    </bean>
De esta forma, en tus script's podrás hacer cosas del tipo:
    …
    if (custom.isAdmin(user))…
    …
La info completa la tienes en el wiki: http://wiki.alfresco.com/wiki/JavaScript_API#Adding_Custom_Script_APIs

2.- Usar Web script "avanzado". Como bien sabes, el API javascript queda limitadito comparado con el API Java de Alfresco. Lógicamente los ingenieros de Alfresco son conscientes de ello. Para los casos en que el API Javascript se queda corto para cubrir la funcionalidad, es posible intercalar API Java en el Web Script. Lo que se hace es enlazar el web script con un bean de java que puede tomar todo el control del web script, o bien, trabajar conjuntamente con el script y las plantillas del web script.
Para estos casos, te recomiendo esta parte del wiki donde se explica cómo hacerlos: http://wiki.alfresco.com/wiki/Web_Scripts#Java-backed_Web_Scripts

Y entre ambas alternativas, ¿qué es mejor? Pues creo que depende.
- Extender el API de Javascript va a dar más potencia a tus scripts, de manera que puedes incluir en el repositorio script's que realicen mayor funcionalidad. No sólo scripts de web scripts, sino de cualquier script dentro del repositorio.
- Si todo vas a hacerlo por Webscript's quizás te resulte más cómodo aprovechar la alternativa de Java-backed Webscripts. La única "pega" que les vi (aviso que he hecho muy poquito dentro de este tema…y quizás sea una confusión mía) es que pierden la capacidad de ser dinámicos, en el sentido de que los Web scripts se pueden modificar en "caliente": Modificas el script o la plantilla que se encuentra en el repositorio, y se reflejan los cambios sin necesidad de reiniciar le servidor.
Si se quisiera modificar la lógica de un Java-WebScript, tendrías que regenerar los javas en un JAR, detener el servidor y rearrancar…..aunque visto así, también lo deberías hacer si se quiere modificar las extensiones de tu API javascript…
Personalmente, me decantaría por los JAva Web Scripts…pero es más personal que otra cosa  Smiley Very Happy

En fin, espero que te resulten útiles estas alternativas y puedas avanzar sin problemas en el tema de tus Web Scripts.
Un saludo y hasta pronto!

ricard
Champ in-the-making
Champ in-the-making
Bufff, me lo temía! La verdad es que en este caso hay que usar los Webscripts hasta donde sea posible y intentar no extender la API ya que entonces se pierden las garantías de la licencia Enterprise.

En cualquier caso, creo que por lo menos he resuelto el tema de saber si un usuario es Admin.

El Script en concreto sería (por si a alguien le sirve aunque no es muy académico, y suponiendo que en Company Home solamente tienen full control los admins, aunque es posible cambiar eso):

var esAdmin, compHome;
compHome = search.luceneSearch("PATH:\"/app:company_home\"")[0];
esAdmin = compHome.hasPermission("FullControl");
model.esAdmin = esAdmin.toString();

Comentar que según el usuario, el objeto global companyhome no existe, por tanto capturo el companyhome a través de la API Lucene

Lógicamente, si alguien no es admin y le damos full control a Company Home, no nos vale este script Smiley Very Happy

Y en cuanto a lo de autenticarse como Admin, de momento tiraré con lo que comentaba de generar 2 tickets, uno de un admin y uno del usuario en cuestión y ir haciendo llamadas.

Gracias por la respuesta y hablamos