認証結果にアクセスするために AuthenticationComponent
にアクセスすることができます。
ユーザーの身元とログアウトユーザーを取得できます。
他のコンポーネントと同じように AppController::initialize()
でコンポーネントをロードします
$this->loadComponent('Authentication.Authentication', [
'logoutRedirect' => '/users/login' // デフォルトはfalse
]);
一旦ロードされると、全てのアクションが認証済みユーザーでしか入れなくなります。
しかし、他のアクセス制御チェックは行わないでください。
このチェックを無効にするには allowUnauthenticated()
を使います:
// beforeFilter メソッドの中に記述してください。
$this->Authentication->allowUnauthenticated(['view']);
認証されたユーザーデータを取得するには認証コンポーネントのこちらを使用します
$user = $this->Authentication->getIdentity();
リクエストインスタンスから直接ユーザーデータ を取得することもできます。:
$user = $request->getAttribute('identity');
認証処理が成功したかどうかは、結果オブジェクトにアクセスすることで確認できます。:
// 認証コンポーネントを使います。
$result = $this->Authentication->getResult();
// リクエストオブジェクトを使います。
$result = $request->getAttribute('authentication')->getResult();
if ($result->isValid()) {
$user = $request->getAttribute('identity');
} else {
$this->log($result->getStatus());
$this->log($result->getErrors());
}
結果セットは getStatus()
から返されたオブジェクトの状態が、結果オブジェクトの中のこれらの定数のいずれかと一致します。:
ResultInterface::SUCCESS
, うまくいった場合。
ResultInterface::FAILURE_IDENTITY_NOT_FOUND
, 身元が不明の場合。
ResultInterface::FAILURE_CREDENTIALS_INVALID
, クレデンシャルが無効な場合。
ResultInterface::FAILURE_CREDENTIALS_MISSING
, クレデンシャルがリクエストに含まれていない場合。
ResultInterface::FAILURE_OTHER
, その他の種類の障害が発生した場合。
getErrors()
が返すエラー配列には、
認証を試みた特定のシステムから得られる 追加の 情報が含まれています。
例えば、LDAPやOAuthなどは、その実装に特有のエラーをここに書き込むことで、
原因のロギングやデバッグを容易にすることができます。
しかし、同梱されている認証子のほとんどはここには何も入れていません。
ログアウトするには:
$this->Authentication->logout();
もし、 logoutRedirect
を設定しているならば、
Authentication::logout()
はその値を返します。
それ以外の場合は、 false
を返します。
どちらの場合も実際のリダイレクトは行われません。
あるいは、 コンポーネントの代わりに、サービスを使ってログアウトすることもできます
$return = $request->getAttribute('authentication')->clearIdentity($request, $response);
返される結果には、次のような配列が含まれます。:
[
'response' => object(Cake\Http\Response) { ... },
'request' => object(Cake\Http\ServerRequest) { ... },
]
注釈
これはリクエストオブジェクトとレスポンスオブジェクトを含む配列を返します。 両方とも不変なので、新しいオブジェクトを取り戻すことができます。 変更されたレスポンスやリクエストオブジェクトを使い続けたい場合は、 作業しているコンテキストに応じて、今後はこれらのインスタンスを使用しなければならないでしょう。
デフォルトでは 認証コンポーネント
は、 Controller.startup
イベントの間に存在するIDを自動的に強制します。
このチェックは Controller.initialize
イベント中に適用することもできます:
// コントローラの initialize() メソッドの中です。
$this->loadComponent('Authentication.Authentication', [
'identityCheckEvent' => 'Controller.initialize',
]);
また、 requireIdentity
オプションを使って ID チェックを完全に無効にすることもできます。