ホーム > CakePHP > CakePHPでオレ専用ブログを作ってみる vol.4

CakePHPでオレ専用ブログを作ってみる vol.4

認証コンポーネントを使う

CakePHPに用意されているAuthコンポーネントを使用して認証機能を実装する。

Authコンポーネントはデフォルトで「users」という名前のテーブルを参照して認証を行うようになっているので、この名前を使って新しくテーブルを作成する。テーブルに用意するフィールドはid、username、passwordの三つ。

mysql> create table users(
    -> id int not null auto_increment primary key,
    -> username varchar(50) not null,
    -> password varchar(50) not null);

パスワードのフィールド(password)については最低でも40文字以上は保管できるように設定しておくこと。SHA1による暗号化がされるので、これよりも短いと正しく値を保持できなくなる。

ちなみに、この認証のための暗号化に使用されるのが、最初のセットアップ時に文字列を書き換えた「Security.salt」。ユーザ名やパスワードを登録した後でこの値を変更すると認証機能が働かなくなるので注意。最初に変更したら以後はもう変更しないこと。(変更した場合はusersテーブルを新しく作り直す必要がある)

Usersコントローラを作成する

app/controllers/users_controller.php


ビューの作成

Usersコントローラに用意してあるloginとlogoutの二つのアクション用に二つのビューファイルを用意する。

app/views/users/login.ctp

check('Message.auth')) $session->flash('auth');
echo $form->create('User', array('action' => 'login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('ログイン');

app/views/users/logout.ctp

tag('h3', 'ログアウトしました。') ?>

このlogout.ctpはユーザ側に表示されることはない。ダミーとして置いておくだけのものらしい。

Entriesコントローラーの修正

Entriesコントローラのの全てにAuthによる認証が適用されるように、次の一文をEntriesControllerクラスに追加する。(コントローラ内のいずれかのアクションにではなく、class自体に)

app/controllers/entries_controller.php

public $components = array('Auth');

これで「Usersコントローラ」の全てにおいて認証がかかるようになった。ブラウザで「http://IPアドレス/cblog/entries(エントリ記事一覧ページ)」にアクセスすると、これまでのようには記事一覧を表示せず、ログインフォームのある「login.ctp」へリダイレクトされる。この段階では、ログインユーザでないと新規投稿も記事の閲覧も出来ない状態になった。

ユーザ登録ページのビューを作成する

Usersコントローラで使用するビューなので/views/users/内に作る。

app/views/users/add.ctp

ユーザ登録

'add' echo $form->create('User', array('action' => 'add')); echo $form->input('username'); echo $form->input('password'); echo $form->end('ログイン');

ユーザ登録のためのadd()アクションを定義する

add()アクションはユーザ登録のためのアクションなのでUsersコントローラ(users_controller.php)に定義する。

app/controllers/users_controller.php

    function add() {
        // $this->dataが空でなければ
        if(!empty($this->data)) {
            if($this->data) {
                // ユーザレコードにユーザ情報を保存する
                $this->User->create();
                $this->User->save($this->data);
                // 保存したらLoginページにリダイレクト
                $this->redirect(array('action' => 'login'));
            }
        }
    }

この状態でこの「cblog/users/add」にブラウザでアクセスしても、またしても「cblog/users/login」にリダイレクトされてしまう。それは当然で、Usersコントローラには認証コンポーネントが組み込まれているから、非ログイン状態ではどのページも表示出来ずにログインページにリダイレクトされてしまう。

認証を使用しないページを登録する

認証コンポーネント「Auth」を使わないページとしてユーザ登録ページを登録し、その上であらためてユーザ登録ページへアクセスして登録を行うことにする。非ログインユーザでも、既存の投稿エントリ一覧、エントリ自体は見られるようにしたいので、これも同様に登録することにする。

コントローラに「beforeFilter」というメソッドを用意する。このメソッドはAuthなどの処理が開始される前に実行される。Usersコントローラクラスに追加してみる。

app/controllers/users_controller.php

    function beforeFilter() {
        // Authのallowメソッドを呼び出してadd()とlogout()アクションには認証がかからないようにする
        $this->Auth->allow('add');
        $this->Auth->allow('logout');
    }

これでaddとlogoutについては認証が働かないように(ログインしなくてもアクセス可能)なった。

これで再度「http://IPアドレス/cblog/users/add」ユーザ登録ページにアクセスし、ユーザ名とパスワードを入力して登録ボタンを押すと、ユーザデータがusersテーブルに保存され、ブラウザの画面はログイン画面「http://IPアドレス/cblog/users/login」にリダイレクトされる。

登録したユーザ情報を入力して送信するとログイン完了し、エントリ一覧ページ(/cblog/entries/index/)にリダイレクトされる。

ログアウトを機能させる

いまのところログアウト用のリンクボタンとかを用意していないので、ログアウトするにはアクションを直接呼び出す必要がある。ブラウザで「http://IPアドレス/cblog/users/logout」をリクエストすると画面に「ログアウトしました。」という文言が表示される。

しかし、この状態(ログアウトした)で再度エントリ一覧ページにアクセスすると、ログイン時と同じように記事一覧を見ることが出来る。Usersコントローラクラスのlogout()アクションを次のように記述して、ログアウト機能が働くようにする。

app/controllers/users_controller.php

    function logout() {
        $this->Auth->logout();
    }                                                                        |    }

再度ブラウザで「http://IPアドレス/cblog/users/logout」をリクエストすると、今度はちゃんとログアウトされるようになった。

エントリ記事一覧とエントリ記事自体を認証から外す

エントリ記事一覧と、エントリ記事自体はログインしていなくとも(一般にも)見えるようにしたいので、前述のbeforeFilterメソッドをさらに追加してみる。

どちらもEntriesコントローラに含まれるメソッド(アクション)なので、Entriesコントローラを開いて、index()アクション(エントリ記事一覧)とview()アクション(エントリ記事自体)を「Authコンポーネントからallowする」ように記述する。

app/controllers/entries_controller.php
beforeFilterメソッドを追加

    function beforeFilter() {
        // エントリ記事一覧は非ログイン状態でも閲覧可能にする
        $this->Auth->allow('index');
        // エントリ記事自体も同じく
        $this->Auth->allow('view');
    }

これで、とりあえずは新規投稿は登録済みのユーザでないと出来ない状態になった。エントリに関しては一覧も記事自体も閲覧可能。

オープンソース徹底活用 CakePHPによるWebアプリケーション開発
掌田 津耶乃
秀和システム
売り上げランキング: 174026
おすすめ度の平均: 5.0

5 初心者向け
5 深く書かれていて便利である

コメント:0

コメントフォーム
入力した情報を記憶する

トラックバック:0

この記事のトラックバック URL
http://showzine.info/blog/2009/08/cakephp%e3%81%a7%e3%82%aa%e3%83%ac%e5%b0%82%e7%94%a8%e3%83%96%e3%83%ad%e3%82%b0%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b-vol-%ef%bc%94.html/trackback
トラックバックの送信元リスト
CakePHPでオレ専用ブログを作ってみる vol.4 - SHOWJIN*BLOG より

ホーム > CakePHP > CakePHPでオレ専用ブログを作ってみる vol.4

検索
フィード

ページの上部に戻る