認証アーキテクチャ¶
Kanboardは柔軟でプラガブルな認証アーキテクチャを提供しています。
デフォルトで複数の方法でのユーザー認証をすることができます:
- ユーザー名とパスワード (ローカルなデータベースとLDAP)
- OAuth2 認証
- リバースプロキシ認証
- Cookie ベースの認証 (Remember Me)
更に、認証に成功した後も、2要素認証をすることができます。Kanboard は TOTP 標準をネイティブでサポートしています。
認証インターフェース¶
プラガブルなシステムを持っているので、認証ドライバーにインターフェースを与えなければなりません:
認証プロバイダの例:¶
- -デフォルトのデータベースのメソッドの実装は
PasswordAuthenticationProviderInterfaceとSessionCheckProviderInterfaceです。 - リバースプロキシのメソッドの実装は
PreAuthenticationProviderInterfaceとSessionCheckProviderInterfaceです。 - グーグルを利用するメソッドでの実装は
OAuthAuthenticationProviderInterfaceです。 - LDAPを利用するメソッドでの実装は
PasswordAuthenticationProviderInterfaceです。 - RememberMe cookieのメソッドの実装は
PreAuthenticationProviderInterfaceです。 - 二要素認証(TOTP) メソッドの実装は
PostAuthenticationProviderInterfaceです。
認証のワークフロー¶
HTTPのリクエストの都度:
- ユーザーのセッションが既に開かれている場合、
SessionCheckProviderInterfaceを実行します。 - 全ての認証プロバイダは
PreAuthenticationProviderInterfaceを実行します。 - エンドユーザーがログインフォームを使用するならば、
PasswordAuthenticationProviderInterface認証プロバイダ が実行されます。 - エンドユーザーがOAuth2の使用を望むならば、選択したプロバイダが実行されます。
- 認証が成功した後は、最後に登録されている
PostAuthenticationProviderInterfaceが使用されます。 - 必要ならば、ユーザー情報を同期します。
このワークフローは Kanboard\Core\Security\AuthenticationManager クラスで管理されています。
トリガされるイベント:
AuthenticationManager::EVENT_SUCCESS: 認証成功AuthenticationManager::EVENT_FAILURE: 認証失敗
認証失敗イベントが起こる都度、ログイン失敗カウンターが加算されます。
総当たり攻撃を回避するため、設定された上限に達した時にユーザーアカウントがロックされ、captcha認証が表示されます。
ユーザー情報提供インターフェース¶
認証が成功した時, AuthenticationManager は getUser() メソッドと呼ばれるドライバを呼び出し、ユーザー情報を問い合わせます。
このメソッドは Kanboard\Core\User\UserProviderInterface として実装されているインターフェースにオブジェクトを返す必要があります。
この抽象化されたクラスは別のシステムから情報を集めます。
例:
DatabaseUserProvider内部のユーザーの情報を提供します。LdapUserProviderはLDAPのユーザーの情報を提供します。ReverseProxyUserProviderはリバースプロキシのユーザーの情報を提供します。GoogleUserProviderはGoogleのユーザー情報を再送します。
ユーザー情報提供インターフェースのメソッド:
isUserCreationAllowed(): 自動でのユーザー作成を許容しtrueを返すgetExternalIdColumn(): 外部IDのカラム名を取得する (google_id, github_id, gitlab_id…)getInternalId(): 内部データベース上のIDを取得するgetExternalId(): 外部ID (ユニークな id) を取得するgetRole(): ユーザーの役割を取得するgetUsername(): ユーザー名を取得するgetName(): ユーザーのフルネームを取得するgetEmail(): ユーザーのemailアドレスを取得するgetExternalGroupIds(): 外部グループのIDを取得し、もしあれば自動でグループのメンバーシップを同期するgetExtraAttributes(): ローカルの同期のためにセットする、追加の属性を取得する
個々のメソッドは必ずしも値を返すわけではありません。
ローカルのユーザーの同期¶
ユーザーの情報はローカルのデータベースと自動で同期可能です。
getInternalId()の返り値があった場合、その値は同期が実行されません。getExternalIdColumn()とgetExternalId()メソッドの返り値をユーザーと同期しなければなりません。- プロパティの返り値が空の文字列の場合、同期されないでしょう。