2011-06-16 10 views
5

Apenas puedo encontrar documentación sobre cómo diseñar y crear un repositorio para múltiples usuarios.Administración de usuarios de Jackrabbit

Soy bastante nuevo en Jackrabbit y siempre estaba usando credenciales de usuario maestro para crear un repositorio al que accediera solo un usuario maestro.

Ahora necesito un repositorio compartido por miles de usuarios y cada usuario trabaja con sus nodos y no tiene permisos para los demás.

El SimpleAccessManager es bastante simple:

public boolean isGranted(ItemId id, int permissions) throws RepositoryException { 
    checkInitialized(); 
    if (system) { 
     // system has always all permissions 
     return true; 
    } else if (anonymous) { 
     // anonymous is always denied WRITE & REMOVE permissions 
     if ((permissions & WRITE) == WRITE 
       || (permissions & REMOVE) == REMOVE) { 
      return false; 
     } 
    } 

    return true; 
} 

Parece que no se puede crear un repositorio como multi-usuario con SimpleLoginModule y SimpleAccessManager. Porque diferencia sólo entre ADMIN y los usuarios anónimos que pueden leer todo, pero no puede escribir ...

Así que uno tiene que usar DefaultAccessManager y tal vez hacer algo como esto:

Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray())); 

UserManager um = ((JackrabbitSession) session).getUserManager(); 
User user = um.createUser("john", "doe"); 

/* And assign some ALC as follows... And then play with it like this, which really sucks without proper documentation, one has to reverse engineer everything, wtf */ 

AccessControlManager acm = session.getAccessControlManager();  
AccessControlPolicyIterator it = acm.getApplicablePolicies(testRootNode.getPath()); 
while (it.hasNext()) { 
    AccessControlPolicy acp = it.nextAccessControlPolicy(); 

    Privilege[] privileges = new Privilege[]{acm.privilegeFromName(Privilege.JCR_WRITE)}; 

    ((AccessControlList)acp).addAccessControlEntry(new PrincipalImpl(user.getUserID()), privileges); 

    acm.setPolicy(testRootNode.getPath(), acp); 
} 

El depósito será accesible a través de OpenCMIS que proporciona credenciales de usuario del cliente.

EDIT: esto es lo que estaba buscando AccessControl

+2

En realidad Victor es porque JackRabbit es una implementación de un Repositorio de contenido de Java, que es una especificación. JCR ... JackRabbit ... ¿entiendes? – MJB

Respuesta

0

De la documentación,

el elemento de configuración de seguridad está utiliza para especificar y configuración de autorización de autenticación para el repositorio

Consulte JackRabbit Security configuration docs para obtener más información.

+0

Específicamente esta pieza "Una vez que un usuario ha sido autenticado, Jackrabbit utilizará el AccessManager configurado para controlar qué partes del contenido del repositorio se le permite al usuario acceder y modificar. La clase predeterminada SimpleAccessManager incluida en Jackrabbit implementa un mecanismo de autorización trivialmente simple que otorga acceso de lectura completa a todos los usuarios y acceso de escritura a todos, excepto a los usuarios anónimos ". – MJB

+0

Esto no responde mucho a mi pregunta.Ayer estuve leyendo esto, solo dice que LoginModule se encarga de la autenticación y AccessManager se encarga de ACL ... – lisak

2

No estoy seguro de cuáles son todos los pasos necesarios, pero podría echar un vistazo al repositorio de Hippos CMS, que está basado en Apache JackRabbit. Es un repositorio de contenidos y CMS de código abierto que ha implementado su propia administración de usuarios basada en dominios y facetas.

Puede encontrar la fuente de la parte de seguridad de Hippo CMS here.

+0

Apenas conozco jackrabbit, voy a implementar esto con JR para empezar, además, este proyecto trata principalmente de documentos/metadata CRUD sin UI, por lo que el hipopótamo no sería una buena opción. Pero he estado tratando de tener algo de tiempo libre para jugar con Hippo, especialmente debido a Hippo Portal, que he estado desarrollando en Liferay desde hace unos años, por lo que Hippo + JetSpeed ​​2 me suena muy bien. – lisak

2

Si necesita un repositorio con "miles de usuarios", es mejor que use el módulo de inicio de sesión de JAAS que autentica a los usuarios en función de algún sistema externo (LDAP o base de datos, etc.) y otorga los Roles. Se devuelve una sesión cuando inicia sesión en el repositorio utilizando un nombre de espacio de trabajo y credenciales opcionales. Y como puede ver aquí: http://www.day.com/maven/javax.jcr/javadocs/jcr-2.0/javax/jcr/Session.html, la sesión solo expone los nodos a los que el usuario tiene acceso.

Si necesita aplicar diferentes controles de acceso, claramente el SimpleAccessManager predeterminado no es suficiente para usted, por lo que puede necesitar implementar su propio AccessManager.

Cuestiones relacionadas