CakePHP3と4でログイン後のリダイレクトを実装する方法

CakePHP3と4でログイン後のリダイレクトを実装する方法

300 回閲覧されました

みなさんこんにちは、jonioです。

CakePHPを勉強中ですがログイン後のリダイレクトのやり方についてメモとしてこの記事を残します。

ログイン機能についてはバージョン3.1.0のチュートリアルを使っています。

CakePHPのバージョン

3.1.0と4.5.3でうまくいったので3.1.0〜4.5.3なら動作すると思います。

loginアクションに記述する方法

1つ目はUsersコントローラーのloginアクションに記述する方法です。

Usersコントローラーに沿ったテンプレート(url/users/index)にリダイレクトする場合は下記の書き方になります。

public function login()
{
  if ($this->request->is('post')) {
    $user = $this->Auth->identify();
    if ($user) {
      $this->Auth->setUser($user);
      return $this->redirect(['action' => 'index']);
    }
    $this->Flash->error('ユーザー名またはパスワードが不正です。');
  }
}

別のコントローラーのテンプレートにリダイレクトする場合は上記の7行目が少し変わります。

return $this->redirect(['controller' => 'Demo', 'action' => 'index']);

この場合は「url/demo/index」にリダイレクトします、「’controller’ => ‘Demo’」みたいにコントローラー名を記載しないといけません。

Appコントローラーに記述

全てのコントローラーの継承元のAppコントローラーに記述する場合です。

「CakePHPのプロジェクト > src > Controller > AppController.php」の「initializeメソッド」に記述します。

//既にある記述



$this->loadComponent('Auth', [
  'authenticate' => [
    'Form' => [
      'fields' => [
         'username' => 'email',
         'password' => 'password'
      ]
    ]
  ],
  'loginAction' => [
    'controller' => 'Users',
    'action' => 'login'
  ],
  
  
  //ここから
  'loginRedirect' => [
     'controller' => 'Articles',
     'action' => 'index'
  ],
  //ここまで
  
  
  'logoutRedirect' => [
      'controller' => 'Users',
      'action' => 'login'
  ],
  'authorize' => ['Controller'],
  'unauthorizedRedirect' => $this->referer()
]);
    
$this->Auth->allow(['display', 'view', 'index']);

21行目〜24行目です。

コントローラーの中にリダイレクト先を記述した時と違いコントローラー名も記載しないといけません。(コントローラーがないとどこのコントローラーに対してのアクションか判断できない為)

どちらのコントローラーに記述するのがいいか?

どっちでもいいと思いますが私はログインした時のリダイレクトなのでloginアクションに記述した方がいいのかな〜という感じがします。

動的にリダイレクト先を変える方法

2つのコントローラーで動的にログイン先を変える方法をのサンプルを掲載します。

下記がloginアクションに記述する場合です、権限でリダイレクト先を変えています。

public function login()
{
  if ($this->request->is('post')) {
    $user = $this->Auth->identify();
    if ($user) {
      $this->Auth->setUser($user);
      
      $userRole = $this->Auth->user('role');   //ログインユーザーのroleエンティティを取得

      //switch文ではなくif文でもいい
      switch ($userRole) {
        case 'admin':
          return ['controller' => 'Admin', 'action' => 'dashboard'];
          break;
        case 'manager':
          return ['controller' => 'Manager', 'action' => 'dashboard'];
          break;
        case 'user':
        default:
          return ['controller' => 'Pages', 'action' => 'display', 'home'];
          break;
      }
    }
    $this->Flash->error('ユーザー名またはパスワードが不正です。');
  }
}

下記がAppController.phpに記述する場合です、リダイレクト先をメソッドで指定します。

public function initialize(): void
{
  //既にある記述



  $this->loadComponent('Auth', [
    'authenticate' => [
      'Form' => [
        'fields' => [
          'username' => 'email',
          'password' => 'password'
        ]
      ]
    ],
      'loginAction' => [
      'controller' => 'Users',
      'action' => 'login'
    ],
    'loginRedirect' => $this->redirectUserRole(),      //←この行を修正
    'logoutRedirect' => [
      'controller' => 'Users',
      'action' => 'login'
    ],
    'authorize' => ['Controller'],
    'unauthorizedRedirect' => $this->referer()
  ]);
    
  $this->Auth->allow(['display', 'view', 'index']);
}

そしてredirectUserRoleメソッドをinitializeメソッドの外に記述します。

public function redirectUserBasedOnRole() {
    $userRole = $this->Auth->user('role');

    switch ($userRole) {
        case 'admin':
            return ['controller' => 'Admin', 'action' => 'dashboard'];
            break;
        case 'manager':
            return ['controller' => 'Manager', 'action' => 'dashboard'];
            break;
        case 'user':
        default:
            return ['controller' => 'Pages', 'action' => 'display', 'home'];
            break;
    }
}

これで完成です。