2 フォロワー

認証

認証とは、ユーザーの身元を確認するプロセスです。通常、識別子(例:ユーザー名またはメールアドレス)と秘密トークン(例:パスワードまたはアクセストークン)を使用して、ユーザーが主張する人物であるかどうかを判断します。認証はログイン機能の基礎となります。

Yii は、さまざまなコンポーネントを連携させてログインをサポートする認証フレームワークを提供します。このフレームワークを使用するには、主に次の作業を行う必要があります。

yii\web\User の設定

ユーザー アプリケーションコンポーネントは、ユーザーの認証状態を管理します。実際の認証ロジックを含むアイデンティティクラスを指定する必要があります。次のアプリケーション設定では、ユーザーアイデンティティクラスapp\models\Userに設定されており、その実装は次のセクションで説明されています。

return [
    'components' => [
        'user' => [
            'identityClass' => 'app\models\User',
        ],
    ],
];

yii\web\IdentityInterface の実装

アイデンティティクラスは、次のメソッドを含むyii\web\IdentityInterfaceを実装する必要があります。

  • findIdentity():指定されたユーザーIDを使用して、アイデンティティクラスのインスタンスを検索します。このメソッドは、セッションを使用してログイン状態を維持する必要がある場合に使用されます。
  • findIdentityByAccessToken():指定されたアクセストークンを使用して、アイデンティティクラスのインスタンスを検索します。このメソッドは、単一のシークレットトークンでユーザーを認証する必要がある場合(例:ステートレスなRESTfulアプリケーション)に使用されます。
  • getId():このアイデンティティインスタンスによって表されるユーザーのIDを返します。
  • getAuthKey():有効になっている場合、セッションと自動ログインを検証するために使用されるキーを返します。
  • validateAuthKey():認証キーの検証ロジックを実装します。

特定のメソッドが不要な場合は、空の本体で実装できます。たとえば、アプリケーションが純粋なステートレス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の使用

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::$enableAutoLogintrueに設定する必要があります。yii\web\User::login()メソッドを呼び出す際に、期間パラメーターも指定する必要があります。

ユーザーをログアウトするには、単に以下を呼び出します。

Yii::$app->user->logout();

ユーザーのログアウトは、セッションが有効な場合にのみ意味があります。このメソッドは、メモリとセッションの両方からユーザー認証ステータスをクリーンアップします。また、デフォルトでは、すべてのユーザーセッションデータも破棄します。セッションデータを残したい場合は、代わりにYii::$app->user->logout(false)を呼び出す必要があります。

認証イベント

yii\web\Userクラスは、ログインおよびログアウトプロセス中にいくつかのイベントを発生させます。

  • EVENT_BEFORE_LOGINyii\web\User::login()の開始時に発生します。イベントハンドラーがイベントオブジェクトのisValidプロパティをfalseに設定した場合、ログインプロセスはキャンセルされます。
  • EVENT_AFTER_LOGIN:ログインが成功した後に発生します。
  • EVENT_BEFORE_LOGOUTyii\web\User::logout()の開始時に発生します。イベントハンドラーがイベントオブジェクトのisValidプロパティをfalseに設定した場合、ログアウトプロセスはキャンセルされます。
  • EVENT_AFTER_LOGOUT:ログアウトが成功した後に発生します。

これらのイベントに対応して、ログイン監査、オンラインユーザー統計などの機能を実装できます。たとえば、EVENT_AFTER_LOGINのハンドラーでは、ログイン時刻とIPアドレスをuserテーブルに記録できます。

タイプミスを発見したか、このページの改善が必要だと考えますか?
Githubで編集する !