Cakephp PHP WEB開発

【Cakephp】AuthComponentのscopeオプションは 4で削除

※本サイトはPR表記を含みます。

Cakephp の AuthComponent は 3.1 から scope オプションが非推奨になり、Cake4では削除されていました。

代替としてカスタムファインダーを利用することによって、ログインに条件付けを行うことが可能になります。

Cake4: AppController: 実装当初、scopeオプションがなくなっていることに気づかず

Cake2 からの移行の際に遭遇したのですが、AppController にて AuthComponent のオプション定義をしていたのですが、scope オプションが削除されていることを作業時に気づきませんでした。

特定の条件の際にログインできない状態になり、原因は scope オプションがすでに削除されていたことでした。

$authenticateConfig = [
    'Form' => [
        'userModel' => 'Hoges',
        'fields' => ['username' => 'name', 'password' => 'password'],
        'scope' => ['Hoges.status' => [1]],
    ],
];

scope オプションが利用できていた時は、コードを見てもわかる通り、ログインの際、Hoges.status1 のレコードが対象となります。

Cake4からは scope の代わりに finder を利用する

$authenticateConfig = [
    'Form' => [
        'userModel' => 'Hoges',
        'fields' => ['username' => 'name', 'password' => 'password'],
        'finder' => 'auth', // Auth条件が必要な場合、カスタムファインダーにする。scopeの代わり
    ],
];

finder => auth の定義は モデルの Hoges 内に findAuth のカスタムファインダーがなければ、当然ですが機能しません。

次は当該モデルにカスタムファインダーを定義します。

userModelオプションにて利用するモデルテーブルにカスタムファインダを設定

上記コード $authenticateConfig 変数に authComponent のオプション群を定義していますが、その中の userModel で定義しているモデルテーブルにカスタムファインダーを定義することで finder オプションを有効にすることができます。

/**
 * AuthComponent: ユーザ認証用
 *
 * @param \Cake\ORM\Query $query クエリー
 * @param array $options クエリーオプション
 * @return \Cake\ORM\Query
 */
public function findAuth(Query $query, array $options): Query
{
    $query
        ->select(['id', 'name', 'password'])
        ->where(['status' => 1]);

    return $query;
}

このようにすることで、ログイン認証の際に、status1 (有効とする)のものに対してのみ、ログイン許可するといったことが可能になります。

Cake3: AuthComponent: 認証ハンドラーの設定
https://book.cakephp.org/3/ja/controllers/components/authentication.html#id4

-Cakephp, PHP, WEB開発
-