開発メモ,主に補足by子連れ親父プログラマー

2011-09-18

CakePHP1.3で作る会員管理システム(16) ログイン認証

ログイン認証

会員がログインできるようにします。 最初にログインする画面とログインした後の会員用のメニュー画面のテンプレを作っておきます。 それぞれこんな感じで適当に。 会員ログイン画面 login.ctp のファイル名で。

<div class="members form">
<?php echo $this->Form->create('Member', array('action' => 'login'));?>

    <h2><?php __('ログイン'); ?></h2>
    <?php
        echo $this->Form->input('email',array('label' => array('text'=>'メールアドレス')));
        echo $this->Form->input('password',array('label' => array('text'=>'パスワード')));
    ?>
    <?php echo $this->Form->end(__('ログイン', true));?>
</div>
<div class="actions">
    <ul>
        <li><?php echo $this->Html->link(__('新規登録はこちら', true), array('action'=>'add')); ?></li>
    </ul>
</div>

会員メニュー画面 menu.ctp のファイル名で。

<div class="members index">
    <h2><?php __('会員メニュー'); ?></h2>
</div>
<div class="actions">
    <ul>
        <li><?php echo $this->Html->link(__('会員情報の更新', true), array('action'=>'edit')); ?></li>
        <li><?php echo $this->Html->link(__('退会手続き', true), array('action'=>'leave')); ?> </li>
        <li><?php echo $this->Html->link(__('ログアウト', true), array('action'=>'logout')); ?> </li>
    </ul>
</div>

ログアウトの完了画面も作っておきます。logout.ctp のファイル名で。

<div class="members index">
    <h2><?php __('ログアウトしました'); ?></h2>
</div>

簡単なやつでいいです。 で、コントローラ members_controller.php にログイン、ログアウトそれぞれのアクションを入れます。 ログインがこんな感じで。

    function login() {
        $this->Member->recursive = 0;
        $this->Session->destroy();
        if (!empty($this->data)) {
            if ($this->data['Member']['email']) {
                $member = $this->Member->findbyEmail($this->data['Member']['email'], array('id','password'));
                if ($member['Member']['password'] === $this->data['Member']['password']) {
                    $this->Session->write('Member.id', $member['Member']['id']);
                    $this->redirect(array('action'=>'menu'));
                } else {
                    $this->Session->setFlash(__('ログインIDまたはパスワードが違います', true));
                }
            }
        }
    }

入力された email の値で、 findbyEmail を使ってクエリーを投げます。 実行されたクエリーはこのようなものです。

SELECT `Member`.`id`, `Member`.`password` FROM `members` AS `Member` LEFT JOIN `types` AS `Type` ON (`Member`.`type_id` = `Type`.`id`) WHERE `Member`.`email` = 'your@email' LIMIT 1

結果のパスワードと入力されたパスワードの値を比較します。 認証OKだったら、 ‘Member.id’ というセッションに結果の id を入れます。 メニュー画面へリダイレクトします。

ログアウトは、

function logout() {
    $this->Session->destroy();
}
ただセッションを破棄するだけです。

メニューは、

function menu() {
    if (!$this->Session->check('Member.id')) {
        $this->redirect(array('action'=>'login'));
    }
}
Member.id というセッションがあるかどうかチェックします。

なければログイン画面にリダイレクトします。 function edit() にも、以下のチェックを入れておきます。

    function edit($id = null) {
        if (!$this->Session->check('Member.id')) {
            $this->redirect(array('action'=>'login'));
        }

        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Invalid member', true));

ブログ アーカイブ

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー