【cakephp3】lolipopでログイン認証処理を設定する【auth component】

IT技術系

lolipopでログイン認証処理を設定する

cakephp3でauth componentを設定した際の手順を説明します。

cakephp3では、始めからauthコンポーネントが実装されていますので、呼び出すだけで認証システムができます。簡単・便利で素晴らしいですね。

コントローラーの修正

src/Contoroller/UsersController.php


use Cake\Event\Event;

class UsersController extends AppController{

/**
* initialize
*/
public function initialize(){
  // Flashコンポーネント。エラーメッセージの表示などに使用
  $this->loadComponent('Flash'); 

  // RequestHandlerコンポーネント。入力されたデータの取得などに使用
  $this->loadComponent('RequestHandler'); 

  // authコンポーネント。遷移先の設定など
  $this->loadComponent(
    'Auth',['loginRedirect' => ['controller' => 'users','action' => 'index'],
    'logoutRedirect' => ['controller' => 'users','action' => 'login'],
    'authenticate' => ['Form' => ['fields' => ['username' => 'email', 'password' => 'password']]],
    'authError' => 'ログインできませんでした。ログインしてください。',
    ]);

  //session
  $this->Session = $this->request->session();
}

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

/**
* login(認証が不要なページ)
*/
public function login(){
  if($this->request->is('post')) {
    // Postされたユーザー,パスワードをもとにDBを検索、該当するユーザーがreturnされる.
    $user = $this->Auth->identify();

    if ($user) { 
      // 該当するユーザーがいればログイン処理
      $this->Auth->setUser($user);
      return $this->redirect($this->Auth->redirectUrl());
    } else { 
      // 該当するユーザーがいなければエラー
      $this->Flash->error('ユーザー名又はパスワードが間違っています');
    }
  }
}

/**
* ログアウト(認証が不要なページ)
*/
public function logout(){
  // セッションの破棄
  $this->request->session()->destroy(); 
  // ログアウト処理
  return $this->redirect($this->Auth->logout()); 
}

}

①initialize関数で、コンポーネントの呼び出し・設定を行います。
ここでは、認証に必要なユーザーID部分をメールアドレスに変更しています。


'authenticate' => ['Form' => ['fields' => ['username' => 'email', 'password' => 'password']]],

この部分、『’fields’ => [‘username’ => ‘email’』ですね。

②beforeFilter関数で、authコンポーネントの効かないアクションを設定します。
※最初のユーザー作成の際、addアクションの関数を追加して、ユーザー作成後は外してくださいね。


$this->Auth->allow(['login', 'logout', 'add']);

③loginアクションの関数を作成します。

④logoutアクションの関数を作成します。

テンプレートの作成

src/Template/Users/login.ctp



<div class="users index large-9 medium-8 columns content">
<?php echo $this->Flash->render() ?>
<?php echo $this->Form->create() ?>
    <fieldset>
        <legend></legend>
        <?php echo $this->Form->control('email') ?>
        <?php echo $this->Form->control('password') ?>
    </fieldset>
<?php echo $this->Form->button(__('ログイン')); ?>
<?php echo $this->Form->end() ?>
</div>

テンプレートを作成します。説明は要らないかな。

 

Entityの修正

src/Model/Entity/Users.ctp


use Cake\Auth\DefaultPasswordHasher;

class User extends Entity{
	// パスワードのハッシュ化を行う
	protected function _setPassword($password){
	  if (strlen($password) > 0) {
	    return (new DefaultPasswordHasher)->hash($password);
	  }
	}
}

パスワードのハッシュ化の為に追記します。

テーブルの設定

上の画像のようになっていればokです。

注意点

ログインできない時は、DBのpasswordのカラムの長さを確認してください。varcharの255になっていれば良いと思います。私はこれで半日嵌りました…

 

実行

最後に、https://xxxxx.jp/users/loginのように呼び出します。