LoginSignup
0
0

CakePHP5系でauthenticationを公式の言うとおりに導入してもできなかった話

Last updated at Posted at 2024-02-21

はじめに

4系の時の内容を修正し忘れてるせいで、動かないと思われる個所が二か所ありました。
2024/02/19現在での話なので、既に修正されているのかもしれません。
ついでに、自分用のアプリケーションに落とし込むときに躓いたポイントも残しておきます。

一つ目。authenticationのバージョンが合っていない。

公式には

composer require "cakephp/authentication:^2.0"

と書いてあるけど

composer require "cakephp/authentication:^3.0"

が正解でした。
authenticationの2系はCakePHP4系までで、
CakePHP5系には対応していないそうです。

二つ目。RequestHandlerComponentが見つからない。

公式の手順に従って AppControllerのinitializeで

$this->loadComponent('RequestHandler');

とするとエラーになります。
別にloadComponentしなくても問題なく動いたので
ここは削除しました。

自分のアプリ用に修正した箇所

ここからはたぶん蛇足になりますが
併せていろいろいじったことを備忘録として残しておきます。

emailじゃないフィールド名でログインするようにしたい

公式に従っていればApplicationクラスにgetAuthenticationService()という関数を追加している筈です。
これの中に二か所ある
'username' => 'email',

'username' => 'userid',
のように、変更しました。
二か所とも変更しました。

テンプレートのほうも同じように userid をpostするようにします。

セキュリティ用のソルトを変更する

app_local.phpに

    'Security' => [
        'salt' => env('SECURITY_SALT', 'f2330403d2698ca56933f479e1785b2a5d6efa268c9b472310d7b42d9dc93054'),
    ],

なんて値がデフォルトで設定されていると思いますが、
ここを変更しておかないとハッシュ化した意味がうすくなりそうなので
変更しておきました。

基本的にログインしないと使えないサイトにしたい

公式に従って追記した AppController::initialize()の中にある
$this->Authentication->addUnauthenticatedActions(['index','view']);
を削除しました。

非ログイン時に見せたいページはログインと会員登録とお知らせ的なページの3つくらいだったので
各コントローラにそれぞれ記述して対応しました。

ログインページとログイン後のページを変更した

ログイン用のページは /login にしたかったので
LoginControllerを作成しindexアクションにUsers::login()の中身をそのまま持ってきました。
また、initializeに

$this->Authentication->addUnauthenticatedActions(['index']);
$this->Users = $this->fetchTable('Users');

を追加しました。
4系でController名に紐づかないTableの呼び出しで使われていた$controller->loadModel()
廃止になったのでfetchTableを使用しています。

Application.phpのgetAuthenticationService() でログインページを指定しているので
そこも修正する必要があります。二か所あります。

        $authenticationService = new AuthenticationService([
            'unauthenticatedRedirect' => Router::url(['contorler'=>'Login']), //<=ココ
            'queryParam' => 'redirect',
        ]);
        $authenticationService->loadAuthenticator('Authentication.Form', [
            'fields' => [
                'username' => 'username',
                'password' => 'password',
            ],
            'loginUrl' => Router::url(['contorler'=>'Login']), //<=ココ
        ]);

特に、loadAuthenticatorのほうは、ログインページと一致していないとID/Passがあっていても、IDかPassが間違ってるんじゃね?
と言われてログインできなくなります。

そしてリダイレクト先を /home にしたかったので
リダイレクト先を下記のように修正。

$redirect = $this->request->getQuery('redirect', [
    'controller' => 'Home',
    'action' => 'index',
]);

ログアウトも /logout にしたかったので
LogoutControllerを作成し、indexアクションにUserd::logout()の中身を持ってきました。
Loginコントローラと同じく initializeに
$this->Authentication->addUnauthenticatedActions(['index']);
を追加し、ログアウトのメッセージをFlashに格納
$this->Flash->success('ログアウトしました');
ログアウト後のリダイレクト先を /login に変更
return $this->redirect(['controller' => 'Login', 'action' => 'index']);
というようにしました。

せっかくだから routes.php もいじってみよう
ドメイン/ でログインページを出せたほうが良いと思いたので
$builder->connect('/', ['controller' => 'Login', 'action' => 'index']);
としました。 (homeのほうがいいかな)
PagesControllerは使わないのでそれ関係の記述は削除しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0