またどこかでCTOっぽいことやってる人のブログ

フリーランスを経て、またどこかでCTOっぽいことをやってる人が書いてます。何か色々やってます。

CakePHP3でAuth認証エラー時のElement変更してみた。

気がついたら10月も後半に差し掛かっていました。
なんかやっと寒くなってきたんじゃない?というような感じです。

そう言えば、8月の終わりから某会社でフリーランスやっています。
開発メインのつもりだったのですが、内部調整とか客先ミーティング参加とかもしてます。
久しぶりの感覚で結構楽しいです。

と、私事なのですが7月に娘さんが生まれまして。
子育てなどもしながらフリーランスを楽しんでおります。
子供が生まれた月に会社辞めたのはご愛嬌。

やりたかったこと

本題です。
今、個人でちょっと開発しているWebサービスがありまして、その管理画面はBootstrapで作っています。
※最近になってBootstrap4使い始めました。

で。
エラー時に表示されるFlashメッセージのテンプレートを変更したいなーと思いまして。

src/Template/Element/Flash/

この辺にあるやつです。
何もしないとerror.ctpが使われます。

何で変更したかったのか

Bootstrapのテンプレートを使っているんですが、ログイン画面のレイアウトが小さめなんです。
で、error.ctpは連想配列でも配列でも、ただの文字列でもBootstrap風味に表示できるようカスタマイズしています。
そのまま使っても問題ないのですが、ログイン画面レイアウトサイズ的にフォントサイズを小さくしたかったのです。

ただそれだけなんです。

普通のAuth認証エラー時

何も設定しない、且つログイン画面にFlashメッセージをレンダリングしていた場合は「error.ctp」が問答無用でセットされます。
なので、ここを変更すればいいわけです。

Flashテンプレートを変更する

変更方法は簡単です。
Auth認証のところでFlashメッセージを変更してあげるだけです。
多分、以下のようになります。

<?php
class AppController extends Controller
{

  /**
   * Initialization hook method.
   *
   * Use this method to add common initialization code like loading components.
   *
   * e.g. `$this->loadComponent('Security');`
   *
   * @return void
   */
  public function initialize() {
    parent::initialize();

    $this->loadComponent('RequestHandler', [
      'enableBeforeRedirect' => false,
    ]);
    $this->loadComponent('Flash');
    $this->loadComponent('Security');
    
    $this->loadComponent('Auth', [
      // ログイン処理を実行するControllerとAction
      'loginAction' => [
        'controller' => 'users',
        'action' => 'login',
      ],
      // ログイン成功時にリダイレクトするControllerとAction
      'loginRedirect' => [
        'controller' => 'tops',
        'action' => 'index'
      ],
      // ログアウト処理後にリダイレクトするControllerとAction
      'logoutRedirect' => [
        'controller' => 'users',
        'action' => 'index',
      ],
      'authenticate' => [
        'Form' => [
          'userModel' => 'Users', // Auth認証時に使用するモデル(テーブル複数形)
          'fields' => [
            'username' => 'user_name', // Auth認証時にユーザ名として使用
            'password' => 'user_password'       // Auth認証時にパスワードとして使用する
          ],
          'scope' => [
            'is_deleted' => 0, // Auth認証の追加条件として使用するモデルの対象カラムと値(削除フラグなど)
            'role_type_id IN' => [1, 2, 3, 4]  // ユーザ権限とかチェックする時
          ]
        ]
      ],
      // Auth認証エラー時のエラーメッセージ
      'authError' => ['ログイン認証が切断されました。<br />恐れ入りますが再度ログインして下さい。'],
      // ここでElement設定
      'flash' => [
        'element' => 'error_login'
      ]
      // ここまで追加
    ]);
  }
}

src/Template/Element/Flash/ の配下に「error_login.ctp」というものを準備しておいて、Auth認証設定でそのファイルを指定してあげるだけです。

冗長だなーとは思うのですが、他にいい方法が思いつかなかったのでこういうやり方にしてみました。
error.ctpとerror_login.ctpを作っておいて、共通部分は別のElementを呼んでもいいと思います。


という小ネタでした。