cakephp3

【cakephp3】ログイン認証機能を作成する

こんばんわ!

cakephp3でログイン認証機能を作成したので紹介します。

ユーザーテーブルの作成


CREATE TABLE `users` (
    `id` int(11) NOT NULL,
    `email` varchar(255) NOT NULL,
    `password` varchar(100) NOT NULL,
    `name` varchar(20) NOT NULL,
    `deleteFlg` int(11) NOT NULL DEFAULT '0',
    `created` datetime NOT NULL,
    `modified` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);

bakeでmodel,controller,viewを一通り作成

次のコマンドでuserテーブルのcontroller,model,viewをすべて作成します。
※【-f】の引数は上書きです。

php bin/cake.php bake all users -f

login前はloginページに遷移させるように処理を追加

AppControllerに次のソースを追加します。
AppControllerに追記することにより、ページ全体に対して有効になります。


    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
        $this->loadComponent('Flash');
        //認証処理を追加
        $this->loadComponent('Auth',[
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ],
                ],            
                'loginAction' => [
                    'controller' => 'Users',
                    'action' => 'login'
                ],
            ]
        ]);
    }

login,logout処理を追加

UserContorollerに次のソースを追加します。


//login処理
public function login()
{
	if($this->request->is('post')){
		$user = $this->Auth->identify();
		if($user){
			$this->Auth->setUser($user);
			return $this->redirect($this->Auth->redirectUrl());
		}
		$this->Flash->error('ユーザー名かパスワードに誤りがあります。');
	}
}
//logout処理
public function logout()
{
	$this->Flash->success('ログアウトしました');
	return $this->redirect($this->Auth->logout());
}

loginページを追加

Users/login.ctpを作成し、次のソースを追加します。


<h1>ログインページ</h1>
<?= $this->Form->create() ?>
<?= $this->Form->input('email') ?>
<?= $this->Form->input('password') ?>
<?= $this->Form->button('ログイン') ?>
<?= $this->Form->end() ?>

ユーザー追加(add)ページのみログインせずともアクセスできるよう処理を追加

ログイン認証機能を追加したはよいものの、ユーザーテーブルにレコードがないと、誰もログインすることができなくなってしまいます。
なので、今回はユーザー追加ページのみ、ログイン中でなくてもアクセスできるように例外処理を追加しましょう。

UserController.phpに次のソースを追加します。


public function beforeFilter(\Cake\Event\Event $event) { 
    parent::beforeFilter($event); 
    $this->Auth->allow(['add']); 
}

 

この部分で、action毎に例外処理を追加することが可能です。

パスワードをハッシュ化機能を追加

6までの作業でユーザー追加して、ログインするところまでは一通り可能になります。
しかし、次の写真のように、パスワードがそのまま表示されてしまいます。
他のユーザーに読み取られてしまい、セキュリティ上よくありません。
なのでパスワードをハッシュ化(暗号化)します。

Entity/User.phpに次のソースを追加します。


namespace App\Model\Entity;
use Cake\ORM\Entity;
use Cake\Auth\DefaultPasswordHasher; //追加
class User extends Entity {
    //暗号化処理を追加
    protected function _setPassword($password)
    {
        return (new DefaultPasswordHasher)->hash($password);
    }

この処理を追加することで、次の写真のように、パスワードが暗号化された状態でレコードが登録されます。

また、ログインするときも暗号化前のパスワードでログイン可能です。特に復号化処理を加えずとも自動的に処理してくれているみたいです。