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