Publicador de contenidos

Configuración de usuarios y seguridad


 

Configuración de usuarios y seguridad

La última versión de Cartodruid nos da la posibilidad de identificar al usuario que abre el proyecto con unas capacidades de autenticación básicas. Esto permite por un lado registrar en la base de datos SQLite del proyecto qué usuario ha modificado una Feature, y establecer un control simple de acceso al proyecto.

Para ello tenemos que añadir dentro de la carpeta config un fichero llamado crtdrdSecurity.<Nombre de Proyecto>.xml. La estructura del fichero sería la siguiente:

<securityManager>
       <credentialResolver class="<Nombre de clase>">
       </credentialResolver>
       <authenticationProvider class="<Nombre de clase>"/>
       <userAttResolver class="<Nombre de clase>"/>
</securityManager>

Una vez que tenemos configurado el usuario en la aplicación, si añadimos el campo "USERNAME" a cualquiera de nuestras tablas, cuando creemos o modifiquemos una entidad de dicha tabla se guardará automáticamente el usuario que hizo la modificación. Si has añadido el campo "USERNAME" a la tabla, pero el proyecto no tiene una configuración de seguridad, el campo se rellenará con el valor "defaultUser".

Hay tres componentes que participan en la configuración de la seguridad:

  • CredentialResolver, determina que credenciales va a utilizar el usuario para identificarse.
  • AuthenticationProvider, permite establecer limitaciones en cuanto a qué usuarios pueden abrir un proyecto en base a las credenciales.
  • UserAttResolver, permite localizar información adicional del usuario a partir de la credencial.

 

CredentialResolver 

Determina cómo vamos a obtener las credenciales del usuario (nombre y password). Tenemos varias opciones para ello:

  • BasicCredentialResolver: nos permite indicar usuario y password directamente en el fichero de configuración

  <credentialResolver class="BasicCredentialResolver">  
        <user>Usuario</user>
        <password>Password</password>
  </credentialResolver>

  • GoogleAccountCredentialResolver: establece como usuario la cuenta de Gmail del dispositivo. Requiere permisos para acceder a los contactos.

  <credentialResolver class="GoogleAccountCredentialResolver"/>

  • UserPassCredentialResolver: Al iniciar la aplicación muestra un diálogo para que el usuario introduzca su nombre y password:
     

  <credentialResolver class="UserPassCredentialResolver"/>    

 

AuthenticationProvider 

Se encarga de autenticar al usuario en el sistema. De momento tenemos estas opciones de autenticación:

  • NoOPAuthenticationProvider: Si no se requiere ninguna autenticación.

  <authenticationProvider class="NoOPAuthenticationProvider"/>

  • TableAuthenticationProvider: Se comprueban las credenciales contra los datos almacenados en una tabla de la BD. La configuración sería la siguiente:

<authenticationProvider class="TableAuthenticationProvider">
    <table>
        <bdName>
bd.sqlite</bdName>
        <tableName>
users</tableName>
        <idFieldName>
userName</idFieldName>
        <passFieldName>
password</passFieldName>
        <encryptionMode>
SHA-256</encryptionMode>

    </table>
</authenticationProvider>

      

El password dentro de la base de datos debe estar encriptado con el algoritmo que definamos en encryptionMode.

En encryptionMode podemos utilizar cualquiera de los métodos de encriptación que admite la clase MessageDigest de Java.

https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest

 

UserAttResolver 

Se encarga de cargar los atributos del usuario.

Si tenemos almacenados los atributos del usuario almacenados en una tabla de la BD y queremos recuperarlos podemos añadirlo a la configuración.

  • TableUserAttResolver:   

<userAttResolver class="TableUserAttResolver">
    <table>
        <bdName>bd.sqlite</bdName>
        <tableName>userAtributes</tableName>
        <idFieldName>userid</idFieldName>
        <fields>att1,att2,att3</fields>                  
    </table>            
    <condition>att1=expectedValue</condition>
</userAttResolver>
      

bdName

Nombre del fichero de base de datos que contiene la tabla de atributos

tableName

Nombre de la tabla que contiene los atributos

idFieldName

Nombre del campo por el que se va a hacer el filtrado de la tabla para obtener los atributos

fields

Listado de los campos de la tabla separados por "," que se van a cargar como atributos. Si queremos añadir todos los campos podemos utilizar "*".

condition (opcional)

Condición para comprobar si un atributo tiene un valor determinado. "nombreAtributo=valorEsperado"

 

Configuración por defecto 

Si no existe el fichero de configuración de usuarios o bien no se configura alguno de sus componentes, la configuración por defecto será la siguiente:

  • CredentialResolver: BasicCredentialResolver con valores user="defaultUser" y password="password"
  • AuthenticationProvider: NoOPAuthenticationProvider
  • UserAttResolver: BasicUserAttResolver

 

Restricciones 

TableAuthenticationProvider sólo se podrá utilizar conjuntamente con UserPassCredentialResolver o BasicCredentialResolver puesto que si queremos validar las credenciales contra una tabla de base de datos con es necesario que las credenciales tengan un usuario y password. Si se utiliza otro tipo de CredentialResolver no se va a comprobar la autenticación con la tabla.

 

Ejemplos de Configuración 

  • Ejemplo 1:

<securityManager>
       <credentialResolver class="UserPassCredentialResolver"/>
       <authenticationProvider class="TableAuthenticationProvider">
              <table>
                    <bdName>users.sqlite</bdName>
                    <tableName>users</tableName>
                    <idFieldName>username</idFieldName>
                    <passFieldName>pasword</passFieldName>
                    <encryptionMode>SHA-256</encryptionMode>                
              </table>            
       </authenticationProvider>   
       <userAttResolver class="TableUserAttResolver">
              <table>
                    <bdName>users.sqlite</bdName>
                    <tableName>users</tableName>
                    <idFieldName>username</idFieldName>
                    <fields>*</fields>                
              </table>                         
       </userAttResolver>
</securityManager>

Enlace para descargar el proyecto para importar en CartoDruid:  Example1.crtd

  • Ejemplo 2:

<securityManager>
       <credentialResolver class="GoogleAccountCredentialResolver"/>
       <authenticationProvider class="NoOPAuthenticationProvider"/>     
</securityManager>

Enlace para descargar el proyecto para importar desde CartoDruid:  Example2.crtd