スポンサードリンク

CakePHP
CakePHP

開発も波に乗ってきました。

そんなことはないですが・・・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の使い方

スポンサードリンク