CakePHP 認証機能(Auth)

テーブル作成

usersテーブル
id
username
password
role
created
modified

Bake実行結果

Controller
 └UsersController.php
Model
 └Entity
  └User.php
 └Table
  └UsersTable.php
Template
 └Users
  └add.ctp
  └edit.ctp
  └index.ctp
  └view.ctp

User.php

↓ を追加
use Cake\Auth\DefaultPasswordHasher;

protected function _setPassword($password){
 return (new DefaultPasswordHasher)->hash($password);
}

AppController.php

~\src\Controller\AppController.php
※基底クラスAppContorollerで処理する事により、継承先の全コントローラで認証処理がなされる

【Authコンポーネント追加】
CakePHP Component操作/Authコンポーネントコントローラ」参照

UsersController.php

login処理

function login(){
  if($this->request->isPost()){
    $user = $this->Auth->identify();
    if(!empty($user)){
      $this->Auth->setUser($user);
      return $this->redirect($this->Auth->redirectUrl());
    }
    $this->Flash->error('ユーザー名、またはパスワードが違います。');
  }
}

logout処理

function logout(){
  $this->request->session()->destroy();
  return $this->redirect($this->Auth->logout());
}

認証例外ページ設定処理

function beforeFilter(Event $event){
  parent::beforeFilter($event);
  $this->Auth->allow([
    'index',
    'login',
  ]);
}

ログイン後処理

public function isAuthorized($user = null){
  $action = $this->request->params['action'];

  if (in_array($action, ['index','view'])){
    return true;
  }

  if ($user['role'] === 'admin'){
    return true;
  }

  if ($user['role'] === 'guest'){
    return true;
  }

  return false;
}

login.ctp

~\src\Template\Users\login.ctp

CakePHP Component操作/Authコンポーネントログインページ」参照

POSTデータ

$this->request["params"]=> array(7) {
    ["controller"]=> string(5) "Users"
    ["action"]=> string(5) "login"
    ["pass"]=> array(0) {}
    ["plugin"]=> NULL
    ["_matchedRoute"]=> string(22) "/:controller/:action/*"
    ["_ext"]=> NULL
    ["isAjax"]=> bool(false)
  }
$this->request["data"]=> array(2) {
    ["username"]=> string(5) "user1"
    ["password"]=> string(5) "user1"
  }