
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