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