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.status
が 1
のレコードが対象となります。
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; }
このようにすることで、ログイン認証の際に、status
が 1
(有効とする)のものに対してのみ、ログイン許可するといったことが可能になります。
■ Cake3: AuthComponent: 認証ハンドラーの設定
https://book.cakephp.org/3/ja/controllers/components/authentication.html#id4