スポンサードリンク

開発も波に乗ってきました。
そんなことはないですが・・・w
ある程度の形はできてきたので
そろそろログイン機能を実装してみたいと思います。
スポンサードリンク
ログイン機能の準備
CakePHPには自動的にログインできる?
機能がついているので
それを使って実装していきます。
Userテーブルを作る
会員機能の元となるUserテーブルを作成します。
CREATE TABLE users ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), password VARCHAR(50), created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL );
CakePHPではusersテーブルを作り
カラムにusernameとpasswordを作ると
用意されているログイン機能を使うことができます。
ビューにログインフォームを作成
<h3>ログイン画面</h3> <?php echo $this->Form->create('User'); ?> <table> <tr> <th>ユーザーID</th> <td><?php echo $this->Form->input('username', array('label' => '')); ?></td> </tr> <tr> <th>パスワード</th> <td><?php echo $this->Form->input('password', array('label' => '')); ?></td> </tr> <tr> <td colspan="2" class="center"><?php echo $this->Form->end(); ?></td> </tr> </table>
こんな感じで準備します。
ログイン機能の実装
CakePHPはAuthComponentでユーザー認証を処理します。
・一定のアクションにログインを必要とさせる
・ユーザーのサインインとサインアウトの処理
・ログインユーザーがアクションに到達することが許可されているか
以上のことをしてくれるので便利ですね~。
では、その機能を使うためにコントローラーに
ログイン・ログアウト機能を付けます。
AppController.phpに遷移先を記述
// app/Controller/AppController.php class AppController extends Controller { //... public $components = array( 'Session', 'Auth' => array( 'loginRedirect' => array('controller' => 'posts', 'action' => 'index'), 'logoutRedirect' => array('controller' => 'users', 'action' => 'login') ) );
UsersControllerにログイン・ログアウトのアクションを記述
class UsersController extends AppController { public function login() { if ($this->request->is('post')) { if ($this->Auth->login()) { $this->redirect($this->Auth->redirect()); } else { $this->Session->setFlash('ユーザー名かパスワードが間違っています。'); } } } public function logout() { $this->redirect($this->Auth->logout()); } }
このように書くと自動的にハッシュされたパスワードで認証してくれます。
ハッシュはapp/Config/core.phpに記述したものが使われます。
しかし、ユーザー登録の際にハッシュさせたパスワードを作ればいいですが、
今後はユーザーが登録する場合が多いので
登録画面を作ります。
スポンサードリンク
ユーザー登録画面を作る
UsreControllerに追加するアクションを記述
public function add() { if ($this->request->is('post')) { $this->User->create(); if ($this->User->save($this->request->data)) { $this->Session->setFlash('登録しました。'); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash('登録できませんでした。'); } } }
普通と同じ追加のアクションになります。
次にビューを作ります。
Vierw/Users/add.ctp
<h2>ユーザー登録</h2> <?php echo $this->Form->create('User'); ?> <?php echo $this->Form->input('username'); ?> <?php echo $this->Form->input('password'); ?> <?php echo $this->Form->end('登録'); ?>
これで、ユーザー登録ができる・・・のですが、
このままだとパスワードがハッシュ化されていないので
ハッシュ化するために
Userモデルに追記します。
// app/Model/User.php App::uses('AuthComponent', 'Controller/Component'); class User extends AppModel { // ... public function beforeSave($options = array()) { if (isset($this->data[$this->alias]['password'])) { $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']); } return true; } // ... }
最初の1行目はAuthComponentを読み込んでます。
クラスを読み込むためのusesの使い方はこんな感じだそうです。
App::uses('クラス名', 'パッケージ名');
それで、beforeSaveでパスワードをハッシュ化させています。
beforeSaveは字のごとく
saveメソッドが動く前に動くメソッドです。
これで、ユーザーを登録できるようになりました。
addが使えるようにaddのみ認証を使わないようにする
ユーザー登録ができるようになりましたが、
このままでは、ログインしないとユーザー登録ができない状態になっています。
ユーザー登録するためにユーザーになっていないといけない・・・w
それを回避するために
addアクションはユーザー認証なくても
アクセスできるようにします。
UsersControllerに下記のように記述します。
public function beforeFilter() { parent::beforeFilter(); $this->Auth->allow('add'); // ユーザーに自身で登録させる }
これでaddアクションはユーザー認証なくても
アクセスできるようになりました。
ユーザー認証のアクセス制限は次回もう少し書きます。
(参考)
CakePHP2.0のApp::usesの使い方
スポンサードリンク