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
AuthenticationProviderInt erface Base interface for other authentication interfaces
PreAuthenticationProvider Interface The user is already authenticated when reaching the application, web servers usually define some environment variables
PasswordAuthenticationPro viderInterface Authentication methods that uses the username and password provided in the login form
OAuthAuthenticationProvid erInterface OAuth2 providers
PostAuthenticationProvide rInterface Two-Factor auhentication drivers, ask for confirmation code
SessionCheckProviderInter face 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