今回はタイトルにもある通りCakePHPでのログイン機能について解説していきたいと思います。
尚、私が参考にしたサイトは以下のCakePHP Cook bookです。
是非こちらも見ていただければより一層理解が深まると思います。
【CakePHP Cook book】
https://book.cakephp.org/2/ja/tutorials-and-examples/blog-auth-example/auth.html
気を付けるポイント
CakePHPはそのルールの独特さ故に最初は戸惑うポイントがありますが、 とにかく開発スピードが速い(ひな形の時点でほぼ完成に近いものがそろう)ので、コードのパターンを見つけると他の機能の実装も早くなると思います。コントローラー処理
では早速書いていきましょう。CakeではAppControllerに会員登録やログインログアウト処理を記述します。具体的にここではリダイレクト先、Blowfishを使いパスワードのハッシュ化等の処理を行います。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を記述していきます。
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に分かれており、どこでエラーが出ているのか一目でわかるので、
少しづつコードを書いてはエラーが出ていないか確認する事が機能実装の近道だと思います!
復習も兼ねて他の機能実装についても記事を書く予定です。お疲れ様でした。