5.3 KiB
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
PasswordAuthenticationProviderInterfaceySessionCheckProviderInterface - Reverse-Proxy metodos a implementar
PreAuthenticationProviderInterfaceySessionCheckProviderInterface - 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:
- Si la sesión de usuario esta abierta, ejecuta el registro de proveedores que implementa
SessionCheckProviderInterface - Ejecuta todos los proveedores que implementa
PreAuthenticationProviderInterface - Si el usuario final hace un submit al formulario del login, Los proveedores que implementa
PasswordAuthenticationProviderInterfaceare executed - Si el usuario final quiere usar OAuth2, el selecciona el proveedor a ejecutar
- Despues de una autenticación satisfactoria, el ultimo registro utilizará
PostAuthenticationProviderInterface - 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 satisfactoriaAuthenticationManager::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 :
DatabaseUserProviderproporciona información para un usuario internoLdapUserProviderpara un usuario LDAPReverseProxyUserProviderpara un usuario Reverse-ProxyGoogleUserProviderreprestan 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 usuariosgetExternalIdColumn(): Obtener Identificación del nombre de la columna externa (google_id, github_id, gitlab_id...)getInternalId(): Obtener el id interno de la base de datosgetExternalId(): Obtener el id externo(Unique id)getRole(): Obtener el rol de usuariogetUsername(): Obtener en nombre de usuario ** username **getName(): Obtener nombre completo del usuariogetEmail(): Obtener el correo electronico del usuariogetExternalGroupIds(): Obtiene los ids externos del grupo, automáticamente sincroniza la membresia del grupo y la presentagetExtraAttributes(): 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()ygetExternalId()debe regresar un valor para sincronizar el usuario - Las propiedades que regresan un ** String ** vacios no se sincronizan