Activar Auditoría en Alfresco 3.3

[Actualizado el 7/10/2010 a las 15:30]

La documentación sobre auditoría en Alfresco 3.3 es bastante pobre porque llegó en un momento de transición de la 3.2 al nuevo sistema con servicios y de todo en la 3.4.

Para activar la auditoría se añadirán las siguientes opciones en

alfresco-global.properties

# Auditing
# Audit configuration
# from: alfresco/repository.properties
audit.enabled=true
audit.tagging.enabled=true
audit.repository.enabled=true
audit.cmischangelog.enabled=true
# Setting this flag to true will cause alfresco/auditConfig.xml to be ignored
# when audit is enabled. When false both alfresco/auditConfig.xml and
# alfresco/audit/*.xml will be used.
audit.useNewConfig=false
# Setting this flag to true will force startup failure when invalid audit configurations are detected
audit.config.strict=false

y activar también la auditoría en el siguiente fichero:

auditConfig.xml

<Audit xmlns="http://www.alfresco.org/model/audit/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" enabled="true" auditInternal="false" mode="all">

 

Esto activa la auditoría antigua, pues la nueva no he conseguido que funcione.

La información de auditoría en Alfresco 3.3 se almacena en base de datos.

Para ver estos datos se pueden usar estas consultas de ejemplo:

(Queries para Informix, sí Informix, qué se le va a hacer)

Encontrar usuarios que nunca han entrado o hecho nada para ser auditado:

select *
 from alf_audit_fact fact
 right outer join alf_node_properties prop on fact.user_id = prop.string_value
 where prop.qname_id = 44
 and fact.user_id is null ;

Encontrar todo el contenido que ha sido “visto por un usuario en los últimos 7 días:

select *
 from alf_audit_fact fact
 join alf_audit_source source
 on fact.audit_source_id = source.id
 and (
 (source.service = 'ContentService' and source.method = 'getReader')
 or (source.service = 'FileFolderService' and source.method = 'getReader')
)
 where
 fact.user_id = 'admin'
 and fact.timestamp > DATE(DATE(CURRENT)-7)
 order by fact.id asc ;

Para el metodo crearNodo sería:

or (source.service = 'NodeService' and source.method = 'createNode')

Lista de metodos disponibles desde la tabla alf_audit_source

id application service methd
15 SystemMethodInterceptor NodeService createNode
 17 SystemMethodInterceptor RuleService disableRules
 28 SystemMethodInterceptor RuleService enableRules
 47 SystemMethodInterceptor ContentService getWriter
 64 SystemMethodInterceptor PermissionService setPermission
 66 SystemMethodInterceptor NodeService addAspect
 98 SystemMethodInterceptor PermissionService setInheritParentPermissions
 244 SystemMethodInterceptor NodeService setProperty
 2468 SystemMethodInterceptor NodeService addChild
 2698 SystemMethodInterceptor WorkflowService deployDefinition
 2998 SystemMethodInterceptor NodeService setProperties
 3220 SystemMethodInterceptor AuthenticationService authenticate
 3222 SystemMethodInterceptor AuthenticationService invalidateTicket
 3251 SystemMethodInterceptor AuthorityService createAuthority
 3282 SystemMethodInterceptor PersonService createPerson
 3286 SystemMethodInterceptor AuthenticationService createAuthentication
 3288 SystemMethodInterceptor AuthenticationService setAuthenticationEnabled
 3293 SystemMethodInterceptor AuthorityService addAuthority
 3370 SystemMethodInterceptor AuthenticationService validate
 24934 SystemMethodInterceptor AuthenticationService authenticateAsGuest
 25156 SystemMethodInterceptor FileFolderService getReader
 25174 SystemMethodInterceptor NodeService deleteNode
 25780 SystemMethodInterceptor TemplateService buildDefaultModel
 25782 SystemMethodInterceptor ContentService getReader
 25784 SystemMethodInterceptor TemplateService processTemplate

Más información de Auditoría para Alfresco 3.3
http://wiki.alfresco.com/wiki/Auditing_%28from_V3.2r%29

Espero que haya servido de ayuda.

Anuncios

Explicación de la arquitectura de Alfresco

Recientemente en un cliente hemos necesitado explicar cómo es la arquitectura de sistemas de Alfresco.

La estructura de espacios en Alfresco no es la estructura “física” con la que los documentos se graban en disco. No replica exactamente la distribución que hagamos por carpetas en el sistema de ficheros. (Ver presentación más abajo)

La estructura de carpetas es “lógica” por tanto, pero de cara al usuario es así como los documentos se distribuyen por el repositorio y así los mostrará en un posible acceso por unidad de red de windows, o webdav, o un arbol de directorios.

Otras vistas que podemos realizar a partir de otros elementos de clasificación como las categorías, nubes de tags, o búsquedas prediseñadas en función de tipos de documento o un valor de un metadato, son visibles para el usuario, pero a través de otros sistemas.
Estas vistas podrían ser la la propia interfaz web de Alfresco Share o vistas diseñadas por nosotros a partir de los servicios que ofrece.

En todo caso no habría nunca ningún perjuicio en el rendimiento de Alfresco por clasificar los documentos en carpetas o por nube de tags, todo es transparente para las búsquedas, que únicamente se basan en los índices que se generan automáticamente.

La única recomendación de rendimiento a este nivel que nos da Alfresco es respetar en la estructura de carpetas el número máximo de 1000 nodos por nivel. Es importante en accesos que muestren el árbol de directorios como acceder con Alfresco Share, Alfresco Explorer, CIFS, Webdav, FTP, etc.

Adjunto una pequeña presentación que espero aclare estos conceptos.

Cómo visualizar recursos de tipo espacio en workflows avanzados

En esta entrada ya hablamos de workflows para espacios (folder o space)

El problema es que una vez creado no se ven este tipo de recursos en los detalles del workflow.
Para poder verlos hay que modificar en el alfresco-web-client.jar, el fichero org/alfresco/web/bean/workflow/ManageTaskDialog.java.
Este fichero, en la línea 716, ya está puesto un comentario que nos indica que se filtran los elementos de tipo folder.

// NOTE: folders within workflow packages are ignored for now
if (this.dictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT) ||
ApplicationModel.TYPE_FILELINK.equals(type))
{

Si descomentamos, todos los recursos ya se pueden ver, pero el enlace no funciona correctamene.
Para solucionarlo hay que reescribir la generación de los enlaces.

Los ficheros que he modificado es el org/alfresco/web/bean/workflow/ManageTaskDialog.java (que se compila en el su libreria alfresco-web-client.jar) y alfresco/jsp/workflow/manage-task-dialog.jsp, que se distribuye directamente en ese directorio de alfresco.

ManageTaskDialog.java
manage-task-dialog.jsp

Espero que sea de ayuda.

Alfresco. Duplicate Child Node Name Exception y Versionado (checkin/checkout)

Al mover o crear un nodo, nos podemos encontrar con un error de que ya existe un nodo con este nombre. Para resolver esta excepción tenemos varias opciones:

  • No hacer nada
  • No moverlo
  • Borrar el destino y luego moverlo
  • Moverlo con otro nombre
  • O, la opción más elegante, incrementar la versión del documento haciendo checkin, checkout

Basándome en este post lo probé y llegué a este código, que ya pongo en la respuesta, y que cuento a continuación:

El principio es este:

You should design your script to:
* Check out a working copy of your versioned node.
* Use the new write method to update the content of your working copy.
* Check in your working copy.

Y esta es la solución en código:
(Está en inglés)

This is a move function, that detects if a node already exists
(Variables are in spanish)


// Moves a node to a destination
function moveNode (nodo, destino) {
// Search if exists
var encontrado = destino.childByNamePath(nodo.name);
if (encontrado != null) {
if (! encontrado.hasAspect("cm:versionable")) {
encontrado.addAspect("cm:versionable");
}
var wc = encontrado.checkout();
wc.properties["cm:content"]=nodo.properties["cm:content"];
wc.save();
wc.checkin("Update element: "+nodo.name);
nodo.remove();
}
else
{
nodo.move(destino);
}
}

This only has a problem, increases two versions each time. I guess wc.save(), make his part in it, while we are updating that node.

I hope this helps

Desplegar un workflow a Alfresco desde Eclipse

Para no tener que reiniciar Alfresco cada vez que se cambia un workflow, existe la posibilidad de hacer un despliegue desde Eclipse

Para ello usando el plugin de jbpm de Eclipse ( se describe cómo instalarlo en  http://wiki.alfresco.com/wiki/WorkflowAdministration ), cuando se edita un workflow, en la pestaña de Deployment, se rellenan los datos necesarios para que se conecte con el servidor.

Server name: localhost
Server port: 8080
Server deployer:  /alfresco/jbpm/deployprocess

Y se prueba la conexión con el botón Test Connection

Con esto ya se distribuye el workflow sin tener que reiniciar alfresco

Fuente: http://wiki.alfresco.com/wiki/WorkflowAdministration#Deploying_via_JBoss_jBPM_Process_Designer

Worklfow Deployment

Alfresco Workflow Avanzados sobre espacios (folders)

or defecto en Alfresco no se pueden iniciar Workflows Avanzados sobre espacios.

Pero sí se pueden iniciar a través de un script.

Solamente hay que ejecutar este script sobre el espacio

var workflow = actions.create("start-workflow");
workflow.parameters.workflowName = "jbpm$minameserver:miworkflowProcess";
workflow.parameters["bpm:workflowDescription"] = document.name;
workflow.parameters["bpm:assignee"] = person;
var futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7);
workflow.parameters["bpm:workflowDueDate"] = futureDate;
workflow.execute(document);
 

Actualmente las propiedades de workflow no van a contener a este espacio como datos adjuntos y aparecerá como vacío.

  • Si queremos ejecutar el script ya se hace de la manera habitual

Primero hay que crearlo en
Empresa > Diccionario de datos > Scripts
con el nombre por ejemplo de startWorkflow.js

Después para ejecutarlo se puede hacer de varias maneras, las más habituales son:

  1. Ejecutar el script como acción sobre un elemento. Se accede desde Propiedades del elemento.
  2. Crear una regla para que se ejecute el script cada vez que se cree este espacio

Si al final no era tan difícil… 😉

Fuente: http://wiki.alfresco.com/wiki/WorkflowAdministration#Step_7:_Integration_with_Rules_.28Optional.29

Alfresco Workflow Console

Cuando se crean nuevos workflows en Alfresco, es habitual querer borrar alguno de vez en cuando, o cambiarle el nombre.

Esto no es problema, salvo que cuando volvemos a entrar después de haberlo quitado de nuestra configuración, el viejo workflow sigue apareciendo en la lista de selección.

Esto es porque está registrado en la base de datos y hay que borrarlo, o más correctamente des-desplegarlo, hacer ‘undeploy’

Para ello siguiendo la información que aparece en http://wiki.alfresco.com/wiki/Workflow_Console, accedemos a la consola en http://localhost:8080/alfresco/faces/jsp/admin/workflow-console.jsp

A través de la consola se pueden hacer muchas operaciones, pero aquí solamente voy a describir el borrado de un workflow.

Para borrar workflows:

  1. Accedemos al listado de variables con la orden:
    show definitions all
  2. Borramos el workflow elegido con:
    undeploy definition name <workflowName>
  • Por ejemplo: undeploy definition name jbpm$mynamespace:reviewProcess

Y eso es todo!

Fuente: http://wiki.alfresco.com/wiki/Workflow_Console