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

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

こんばんわ!こふそ(@koheta0325)です!

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

ユーザーテーブルの作成

データベースでUsersテーブルを作成します。

 
CREATE TABLE `users` (
    `id` int(11) NOT NULL,
    `email` varchar(255) NOT NULL,
    `password` varchar(255) NOT NULL,
    `name` varchar(20) NOT NULL,
    `delete_flg` 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に追記することにより、ページ全体に対して有効になります。




class AppController extends Controller
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
        $this->loadComponent('Flash');

        //認証処理を追加
        //ログイン情報の処理
        $this->loadComponent('Auth', [
            'loginAction' => [
                'controller' => 'users',
                'action' => 'login'
            ],
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ]
                ],
            ],
            'storage' => 'Session',
            'authError' => 'ログインしてください。',
            'loginError' => 'ユーザ名もしくはパスワードに誤りがあります',
            'flash' => [
                'element' => 'error',
                'key' => 'auth',
                'params' => [ 'class' => 'alert alert-warning']
            ]
        ]);
    }
}

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ページを追加

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


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

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

ログイン認証機能を追加したはよいものの、ユーザーテーブルにレコードがないと、誰もログインすることができなくなってしまいます。

なので、今回はユーザー追加ページのみ、ログイン中でなくてもアクセスできるように例外処理を追加しましょう。

UsersController.phpに次のソースを追加します。(アクション)


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

この部分で、action毎に例外的にログインしなくてもアクセスできるページを追加することが可能です。

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

6までの作業でユーザー追加して、ログインするところまでは一通り可能になります。

試しにphpMyadmin等を使用し、Usersテーブルにレコードが格納されているかを確認してみましょう!

入っていましたかね??

おそらくデータが保存されていると思います。

しかし、passwordカラムを確認してみると、入力されたパスワードがそのまま表示されていると思います。

このままだと運営者側がユーザーの読み取れてしまい、セキュリティ上よくありません。

自分が運営者だとして、お客様のパスワードが閲覧できる状態になったら大変なことになってしまいます。

なのでパスワードをハッシュ化(暗号化)します。

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);
    }

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

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

 

以上です。