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のように呼び出します。