スマートフォンやhtml5+CSS3など新技術に四苦八苦。jQuery、AjaxなどJavaScriptも難しいですね。そんなWebに悩む人のネタ帳です。

以前に以下のような記事を書きました。
CakePHPでAuthコンポーネントを使ってみる
この時はCakePHP1.3.9で検証したのですが、ログイン処理がマニュアル通り動作しない問題がありました。

原因は不明です。少しコアな部分を調べましたが、分かりませんでした。
デフォルトの設定が原因なのか、単純にバグだったのか分かりませんが、今回、CakePHP1.3.12で試したところマニュアル通り機能したので、改めて書きます。

ユーザ管理テーブルを用意する

こちらは以前と同じ仕様です。「users」テーブルに「username」と「password」のカラムを持たせます。

CREATE TABLE users (
    id INTEGER(8) auto_increment PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    date_create VARCHAR(19) NOT NULL,
    date_update TIMESTAMP NOT NULL
);

ユーザ管理テーブルのモデルを用意する

こちらも以前と同じです。

class User extends AppModel {
    var $name = 'User';
}

adminコントローラを用意する

こちらも以前と同じです。

class AdminController extends AppController {
 
    public $name = "Admin";
    public $uses = array('User');
    public $components = array('Auth');
 
    function beforeFilter(){
        $this->Auth->userModel = 'User';
        $this->Auth->loginAction = array(
            'controller' => 'admin',
            'action' => 'login'
        );
        $this->Auth->loginRedirect = array(
            'controller' => 'admin',
            'action' => 'index'
        );
        $this->Auth->logoutRedirect = array(
            'controller' => 'admin',
            'action' => 'login'
        );
        $this->Auth->allow('login', 'logout');
        $this->Auth->loginError = 'ユーザ名もしくはパスワードに誤りがあります';
        $this->Auth->authError = '管理者としてログインする必要があります';
    }
 
    function index(){
        // 略
    }
 
    function login(){
        // 略
    }
 
    function logout(){
        // 略
    }
}

ログイン画面を作る

ここからが少し違います。
以前はパスワードを入力するフォームに「name=”data[User][password]”」とすると、コントローラでうまく受理できない現象が発生してので、通常のポストで取得するという方法で回避していました。
しかし、今回CakePHP1.3.12では問題なく処理できたので、以下のように記述します。

<?php echo $session->flash('auth'); ?>
<form action="login" method="post">
<table>
<tr>
<th>ユーザ名</th><td><input type="text" name="data[User][username]" /></td>
</tr>
<tr>
<th>パスワード</th><td><input type="password" name="data[User][password]" /></td>
</tr>
<tr>
<th></th><td><input type="submit" value="ログイン" /></td>
</tr>
</table>
</form>

ログイン処理

アクション「login」について、以前はパスワードをPOSTリクエストで取得し、暗号化してDBの内容と比較するという、独自の認証判定処理を記述していました。しかし、今回それが改善されていたことで、一連のロジックはCakePHPで処理されるため、独自で処理を記述する必要はありません。
つまり以下の通りです。もちろん、必要に応じて他の独自の処理を追加することも可能です。

function login(){
}

Authコンポーネントを使った基本的な認証機能の実装のみであれば、これらを一通り用意すれば動作します。
以前は、自身で回避策に手間を取られましたが。ここまでソースをスマートにできて、実装できてこそ、フレームワークの恩恵を感じれますね。

このエントリーをはてなブックマークに追加

Comment

Comment Form

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Monthly Archives

Search