Arquitectura de autenticación ============================= Kanboard provee una flexible y conectable arquitectura de autenticación. Por default, el usuario puede autenticarse con multiple metodos: - Autenticación por usuario y password (Base de datos local y LDAP) - Autenticación OAuth2 - Autenticación Reverse-Proxy - Autenticación basada en Cookie (Recuerdame) Además, despues de una autenticación satisfactoria un puede hacerse post de autenticación Two-Factor . Kanboard sopoarta nativamente el standart TOTP. Interfaces de autenticación ---------------------------- Para tener un sistema conectable, los drivers de autenticación deben implementar un conjunto de interfaces | Interface | Rol | |------------------------------------------|------------------------------------------------------------------| | AuthenticationProviderInterface | Interface base para otras interfaces de autenticación | | PreAuthenticationProviderInterface | The user is already authenticated al alcanzar la aplicación, Usualmente los servidores web definen algunas variables de entorno | | PasswordAuthenticationProviderInterface | El metodo de autenticación que usa el username y password provienen del formulario de login | | OAuthAuthenticationProviderInterface | Proveedores OAuth2 | | PostAuthenticationProviderInterface | Drivers de autenticación Two-Factor ,pide el código a confirmar | | SessionCheckProviderInterface | Los proveedores que son capaces de comprobar si la sesión de usuario es válida | ### Ejemplos de autenticación de proveedores: - Database por default metodos a implementar `PasswordAuthenticationProviderInterface` y `SessionCheckProviderInterface` - Reverse-Proxy metodos a implementar `PreAuthenticationProviderInterface` y `SessionCheckProviderInterface` - Google metodos a implementar `OAuthAuthenticationProviderInterface` - LDAP metodos a implementar `PasswordAuthenticationProviderInterface` - RememberMe cookie metodos a implementar `PreAuthenticationProviderInterface` - Two-Factor TOTP metodos a implementar `PostAuthenticationProviderInterface` flujo de trabajo de autenticación ** Workflow ** ------------------------------------------------ Para cada peticion HTTP: 1. Si la sesión de usuario esta abierta, ejecuta el registro de proveedores que implementa`SessionCheckProviderInterface` 2. Ejecuta todos los proveedores que implementa `PreAuthenticationProviderInterface` 3. Si el usuario final hace un submit al formulario del login, Los proveedores que implementa `PasswordAuthenticationProviderInterface` are executed 4. Si el usuario final quiere usar OAuth2, el selecciona el proveedor a ejecutar 5. Despues de una autenticación satisfactoria, el ultimo registro utilizará `PostAuthenticationProviderInterface` 6. Sincronizar la información del usuario si es necesario Este workflow es manejado por la clase `Kanboard\Core\Security\AuthenticationManager`. Eventos disparados: - `AuthenticationManager::EVENT_SUCCESS`: autenticación satisfactoria - `AuthenticationManager::EVENT_FAILURE`: autenticación fallida Cada vez que se produce un evento de fallo , el contador de intentos fallidos se incrementa. La cuenta de usuario se puede bloquear para el período de tiempo configurado y un captcha puede ser mostrado para evitar ataques de fuerza bruta . Interface de usuario del proveedor --------------------------------- Cuando la autenticación es satisfactoria, la `AuthenticationManager` pedura la información del usuario para que el driver llame al metodo `getUser()`. Este metodo debe regresar un objeto que implementa la interface `Kanboard\Core\User\UserProviderInterface`. Esta clase abstracta reune la información dede otro sistema. Ejemplos : - `DatabaseUserProvider` proporciona información para un usuario interno - `LdapUserProvider` para un usuario LDAP - `ReverseProxyUserProvider` para un usuario Reverse-Proxy - `GoogleUserProvider` represtan un usuario de Google Los métodos para la interface del proveedor de Usuario: - `isUserCreationAllowed()`: Regresa true para permitir la creación automática de usuarios - `getExternalIdColumn()`: Obtener Identificación del nombre de la columna externa (google_id, github_id, gitlab_id...) - `getInternalId()`: Obtener el id interno de la base de datos - `getExternalId()`: Obtener el id externo(Unique id) - `getRole()`: Obtener el rol de usuario - `getUsername()`: Obtener en nombre de usuario ** username ** - `getName()`: Obtener nombre completo del usuario - `getEmail()`: Obtener el correo electronico del usuario - `getExternalGroupIds()`: Obtiene los ids externos del grupo, automáticamente sincroniza la membresia del grupo y la presenta - `getExtraAttributes()`: Obtiene los atributos extras para ser mostrados a el usuario durante la sincronización local No es obligatorio que el metodo devuelva un valor. Sincronización de un usuario local ---------------------------------- La información del usuario puede ser sincronizada automáticamente con la base de datos local. - Si el metodo`getInternalId()` regresa un valor no realiza la sincronización - Los metodos `getExternalIdColumn()` y `getExternalId()` debe regresar un valor para sincronizar el usuario - Las propiedades que regresan un ** String ** vacios no se sincronizan