Authentication Architecture =========================== Kanboard provides a flexible and pluggable authentication architecture. By default, user authentication can be done with multiple methods: - Username and password authentication (Local database and LDAP) - OAuth2 authentication - Reverse-Proxy authentication - Cookie based authentication (Remember Me) More over, after a successful authentication, a Two-Factor post authentication can be done. Kanboard supports natively the TOTP standard. Authentication Interfaces ------------------------- To have a pluggable system, authentication drivers must implement a set of interfaces: | Interface | Role | |------------------------------------------|------------------------------------------------------------------| | AuthenticationProviderInterface | Base interface for other authentication interfaces | | PreAuthenticationProviderInterface | The user is already authenticated when reaching the application, web servers usually define some environment variables | | PasswordAuthenticationProviderInterface | Authentication methods that uses the username and password provided in the login form | | OAuthAuthenticationProviderInterface | OAuth2 providers | | PostAuthenticationProviderInterface | Two-Factor auhentication drivers, ask for confirmation code | | SessionCheckProviderInterface | Providers that are able to check if the user session is valid | ### Examples of authentication providers: - The default Database method implements `PasswordAuthenticationProviderInterface` and `SessionCheckProviderInterface` - The Reverse-Proxy method implements `PreAuthenticationProviderInterface` and `SessionCheckProviderInterface` - The Google method implements `OAuthAuthenticationProviderInterface` - The LDAP method implements `PasswordAuthenticationProviderInterface` - The RememberMe cookie method implements `PreAuthenticationProviderInterface` - The Two-Factor TOTP method implements `PostAuthenticationProviderInterface` Authentication Workflow ----------------------- For each HTTP request: 1. If the user session is already open, execute registered providers that implements `SessionCheckProviderInterface` 2. Execute all providers that implements `PreAuthenticationProviderInterface` 3. If the end-user submit the login form, providers that implements `PasswordAuthenticationProviderInterface` are executed 4. If the end-user wants to use OAuth2, the selected provider will be executed 5. After a successful authentication, the last registered `PostAuthenticationProviderInterface` will be used 6. Synchronize user information if necessary This workflow is managed by the class `Kanboard\Core\Security\AuthenticationManager`. Events triggered: - `AuthenticationManager::EVENT_SUCCESS`: Successful authentication - `AuthenticationManager::EVENT_FAILURE`: Failed authentication Each time a failure event occurs, the counter of failed logins is incremented. The user account can be locked down for the configured period of time and a captcha can be shown to avoid brute force attacks. User Provider Interface ----------------------- When the authentication is successful, the `AuthenticationManager` will ask the user information to your driver by calling the method `getUser()`. This method must return an object that implements the interface `Kanboard\Core\User\UserProviderInterface`. This class abstract the information gathered from another system. Examples: - `DatabaseUserProvider` provides information for an internal user - `LdapUserProvider` for a LDAP user - `ReverseProxyUserProvider` for a Reverse-Proxy user - `GoogleUserProvider` represents a Google user Methods for User Provider Interface: - `isUserCreationAllowed()`: Return true to allow automatic user creation - `getExternalIdColumn()`: Get external id column name (google_id, github_id, gitlab_id...) - `getInternalId()`: Get internal database id - `getExternalId()`: Get external id (Unique id) - `getRole()`: Get user role - `getUsername()`: Get username - `getName()`: Get user full name - `getEmail()`: Get user email address - `getExternalGroupIds()`: Get external group ids, automatically sync group membership if present - `getExtraAttributes()`: Get extra attributes to set for the user during the local sync It's not mandatory to return a value for each method. User Local Synchronization -------------------------- User information can be automatically synced with the local database. - If the method `getInternalId()` return a value no synchronization is performed - The methods `getExternalIdColumn()` and `getExternalId()` must return a value to sync the user - Properties that returns an empty string won't be synced