【Cake PHP2.x】ログイン機能の実装

今回はタイトルにもある通りCakePHPでのログイン機能について解説していきたいと思います。

尚、私が参考にしたサイトは以下のCakePHP Cook bookです。
是非こちらも見ていただければより一層理解が深まると思います。

【CakePHP Cook book】
https://book.cakephp.org/2/ja/tutorials-and-examples/blog-auth-example/auth.html

<h1>気を付けるポイント</h1>
CakePHPはそのルールの独特さ故に最初は戸惑うポイントがありますが、
とにかく開発スピードが速い(ひな形の時点でほぼ完成に近いものがそろう)ので、コードのパターンを見つけると他の機能の実装も早くなると思います。

<h1>コントローラー処理</h1>
では早速書いていきましょう。CakeではAppControllerに会員登録やログインログアウト処理を記述します。具体的にここではリダイレクト先、Blowfishを使いパスワードのハッシュ化等の処理を行います。

```PHP:AppController.php
<?php
App::uses('Controller', 'Controller');

class AppController extends Controller {
	public $components = array(
		'DebugKit.Toolbar' => array('panels' => array('history' => false)),
		'Flash',
        'Session',
        //ログイン後、ログアウト後にどのような処理を行うか
		'Auth' => array(
			'loginRedirect' => array(
                //UsersControllerに記述したログイン処理
				'controller' => 'users',
				'action' => 'login'
            ),
            //UsersControllerに記述したログアウト処理
			'logoutRedirect' => array(
				'controller' => 'submits',
				'action' => 'index',
				'home'
            ),
            //パスワードのハッシュ化
			'authenticate' => array(
				'Form' => array(
					'userModel' => 'User',
					'passwordHasher' => 'Blowfish',
					'hashType' => 'md5',
					'fields' => array(
						'username' => 'email',
						'password' => 'password'
					)
				)
			),
			'authorize' => array('Controller')
		)
	);

	public $helpers = array('Html', 'Form', 'Session');
	public function beforeFilter() {
		$this->Auth->allow('index', 'view');
		//ログイン者の名前表示する
		$this->set('auth', $this->Auth->user());
		//メールアドレスでログインするためカラム切り替え
		$this->Auth->authenticate = array(
			'Form' => array(
				'fields' => array('username' => 'email', 'password' => 'password')
			)
		);
	}

	public $settings = array(
		'fields' => array(
			'username' => 'username',
			'password' => 'password'
		),
		'userModel' => 'User',
		'userFields' => null,
		'scope' => array(),
		'recursive' => 0,
		'contain' => null,
		'passwordHasher' => 'Blowfish'
	);
}
?>
```

次はUsersControllerを記述していきます。

```PHP:UsersController.php
<?php
//AppController使いますよーという宣言
App::uses('AppController', 'Controller');

class UsersController extends AppController {
    //どのヘルパーとコンポーネントを使うか
	public $helpers = array('Html', 'Form', 'Flash');
	public $components = array('Flash', 'Auth');

	public function beforeFilter() {
        //未ログイン者が見れるページ(それ以外はリダイレクト先に飛ぶ)
		parent::beforeFilter();
		$this->Auth->allow('add', 'login', 'logout');
	}

	public function add() {
        //postで送られてきた情報をユーザーテーブルに保存
		if ($this->request->is('post')) {
			$this->User->create();
			if ($this->User->save($this->request->data)) {
				$this->Flash->success(__('会員登録が完了しました'));
				return $this->redirect(array(
					'controller' => 'submits', 'action' => 'index')
				);
			}
			$this->Flash->error(__('登録に失敗しました。再度お試しください'));
		}
	}

	public function login() {
        //送られてきた情報と比べログイン処置
        //ここでハッシュ化されたパスワードと比べる
		if ($this->request->is('post')) {
			if ($this->Auth->login()) {
				$this->Flash->success(__('ログインに成功しました'));
				return $this->redirect($this->Auth->redirect(array(
					'controller' => 'submits', 'action' => 'index'))
				);
			}
			$this->Flash->error(__('メールアドレスもしくはパスワードが違います'));
		}
	}

	public function logout() {
        //ログアウト処理　今回は投稿一覧に飛ぶようにしています。
		if ($this->Auth->login()) {
			$this->Flash->success(__('ログアウトしました'));
			$this->redirect($this->Auth->logout(array(
				'controller' => 'submits',
				'action' => 'index'))
			);
		}
		$this->redirect($this->Auth->redirect(array(
			'controller' => 'submits',
			'action' => 'index'))
		);
	}
}
?>
```

以上がCakePHPでのログイン機能の実装のフローになります！
CakePHPはMVCに分かれており、どこでエラーが出ているのか一目でわかるので、
少しづつコードを書いてはエラーが出ていないか確認する事が機能実装の近道だと思います！

復習も兼ねて他の機能実装についても記事を書く予定です。お疲れ様でした。