認証とは、ユーザーの身元を確認するプロセスです。通常、識別子(例:ユーザー名またはメールアドレス)と秘密トークン(例:パスワードまたはアクセストークン)を使用して、ユーザーが主張する人物であるかどうかを判断します。認証はログイン機能の基礎となります。
Yii は、さまざまなコンポーネントを連携させてログインをサポートする認証フレームワークを提供します。このフレームワークを使用するには、主に次の作業を行う必要があります。
ユーザー アプリケーションコンポーネントは、ユーザーの認証状態を管理します。実際の認証ロジックを含むアイデンティティクラスを指定する必要があります。次のアプリケーション設定では、ユーザーのアイデンティティクラスはapp\models\User
に設定されており、その実装は次のセクションで説明されています。
return [
'components' => [
'user' => [
'identityClass' => 'app\models\User',
],
],
];
アイデンティティクラスは、次のメソッドを含むyii\web\IdentityInterfaceを実装する必要があります。
特定のメソッドが不要な場合は、空の本体で実装できます。たとえば、アプリケーションが純粋なステートレスRESTfulアプリケーションである場合、findIdentityByAccessToken()とgetId()のみを実装し、他のすべてのメソッドを空の本体のままにする必要があります。または、アプリケーションがセッションのみの認証を使用する場合、findIdentityByAccessToken()以外のすべてのメソッドを実装する必要があります。
次の例では、アイデンティティクラスが、user
データベーステーブルに関連付けられたアクティブレコードクラスとして実装されています。
<?php
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
public static function tableName()
{
return 'user';
}
/**
* Finds an identity by the given ID.
*
* @param string|int $id the ID to be looked for
* @return IdentityInterface|null the identity object that matches the given ID.
*/
public static function findIdentity($id)
{
return static::findOne($id);
}
/**
* Finds an identity by the given token.
*
* @param string $token the token to be looked for
* @return IdentityInterface|null the identity object that matches the given token.
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
/**
* @return int|string current user ID
*/
public function getId()
{
return $this->id;
}
/**
* @return string|null current user auth key
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @param string $authKey
* @return bool|null if auth key is valid for current user
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
}
各ユーザーの認証キーを生成し、user
テーブルに格納するには、次のコードを使用できます。
class User extends ActiveRecord implements IdentityInterface
{
......
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($this->isNewRecord) {
$this->auth_key = \Yii::$app->security->generateRandomString();
}
return true;
}
return false;
}
}
注記:
User
アイデンティティクラスとyii\web\Userを混同しないでください。前者は認証ロジックを実装するクラスです。ユーザー資格情報の保存のために永続的なストレージに関連付けられたアクティブレコードクラスとして実装されることがよくあります。後者は、ユーザー認証状態の管理を担当するアプリケーションコンポーネントクラスです。
yii\web\Userは主に、user
アプリケーションコンポーネントに関して使用されます。
Yii::$app->user->identity
という式を使用して、現在のユーザーのアイデンティティを検出できます。これは、現在ログインしているユーザーを表すアイデンティティクラスのインスタンスを返します。現在のユーザーが認証されていない(ゲストである)場合はnull
を返します。次のコードは、yii\web\Userから他の認証関連情報を取得する方法を示しています。
// the current user identity. `null` if the user is not authenticated.
$identity = Yii::$app->user->identity;
// the ID of the current user. `null` if the user not authenticated.
$id = Yii::$app->user->id;
// whether the current user is a guest (not authenticated)
$isGuest = Yii::$app->user->isGuest;
ユーザーをログインするには、次のコードを使用できます。
// find a user identity with the specified username.
// note that you may want to check the password if needed
$identity = User::findOne(['username' => $username]);
// logs in the user
Yii::$app->user->login($identity);
yii\web\User::login()メソッドは、現在のユーザーのアイデンティティをyii\web\Userに設定します。セッションが有効になっている場合、セッションにアイデンティティが保持されるため、ユーザー認証ステータスはセッション全体を通して維持されます。Cookieベースのログイン(つまり、「remember me」ログイン)が有効になっている場合、Cookieにもアイデンティティが保存されるため、Cookieが有効である限り、Cookieからユーザー認証ステータスを復元できます。
Cookieベースのログインを有効にするには、アプリケーション設定でyii\web\User::$enableAutoLoginをtrue
に設定する必要があります。yii\web\User::login()メソッドを呼び出す際に、期間パラメーターも指定する必要があります。
ユーザーをログアウトするには、単に以下を呼び出します。
Yii::$app->user->logout();
ユーザーのログアウトは、セッションが有効な場合にのみ意味があります。このメソッドは、メモリとセッションの両方からユーザー認証ステータスをクリーンアップします。また、デフォルトでは、すべてのユーザーセッションデータも破棄します。セッションデータを残したい場合は、代わりにYii::$app->user->logout(false)
を呼び出す必要があります。
yii\web\Userクラスは、ログインおよびログアウトプロセス中にいくつかのイベントを発生させます。
false
に設定した場合、ログインプロセスはキャンセルされます。false
に設定した場合、ログアウトプロセスはキャンセルされます。これらのイベントに対応して、ログイン監査、オンラインユーザー統計などの機能を実装できます。たとえば、EVENT_AFTER_LOGINのハンドラーでは、ログイン時刻とIPアドレスをuser
テーブルに記録できます。
タイプミスを発見したか、このページの改善が必要だと考えますか?
Githubで編集する !
コメントするにはサインアップまたはログインしてください。