CakePHP2.4で、見せたくないページにちょっとベーシック認証を掛けたかっただけなのに、妙にハマった。
「CakePHP2では、簡単にベーシック認証をかけれる。」らしいのに・・・。
実際、なんということはなかったが、他の認証の情報とか、CakePHP1と勘違いしたりで、ハマった。
さて、CakePHP2でのベーシック認証だが、ステップは以下のとおり。
- データベースにusersテーブルを作る。
- usersテーブルに対応したUserモデルを作る。
- Userモデルに対応したUsersContollerを作って、ユーザーを作る。
- 見せたくないページにAuthコンポーネントでBasicをかける。
とりあえず、手順をざっくり記述していく。
1.データベースにusersテーブルを作る。
こんなかんじかな。
CREATE TABLE IF NOT EXISTS users( id bigint unsigned PRIMARY KEY AUTO_INCREMENT , username varchar( 256 ) NOT NULL , password varchar( 256 ) NOT NULL , created datetime NOT NULL , modified datetime NOT NULL ) ENGINE = InnoDB DEFAULT CHARSET = utf8
カラム名は特に理由がないかぎり変更せずに、usernameとpasswordでにしておくと良い。
createdとmodifedも、とりあえず一緒つけとけばCakeが勝手に使うので、入れおく。
これで、ユーザーを管理するテーブルを作る。
2.usersテーブルに対応したUserモデルを作る。
さて、次に対応するモデルを作る。
<?php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
public function beforeSave($options = array()) {
$this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
//parent::beforeSave($options);
return true;
}
}
こんな感じ。
パスワードをデータベースにそのまま保存せずに、暗号化(ハッシュ化)して保存する。
AuthComponent::password を使えば、ハッシュ化されてパスワードは保存される。
3.Userモデルに対応したUsersContollerを作って、ユーザーを作る。
さて、次にログインするユーザーを作成するために、Userモデルを扱うコントローラーを作成する。
ユーザーがいないとそもそもログインできないしね。
以下の様なコントローラーを作る。
<?php
class UsersController extends AppController{
public $scaffold = "";
}
Userモデルを扱うUsersControllerを作成し、変数名$scaffoldを宣言。
あとは、このコントローラーにアクセスすれば、usersテーブルを扱う諸々ができているはずなので、そこでユーザーを作成する。
4.見せたくないページにAuthコンポーネントでBasicをかける。
さて、いよいよ本題になる。
ベーシック認証をかけたいページに、Authコンポーネントを読み込みんで、beforeFilterで割り付ける。
class HogeController extends AppController{
public $components = array('Session','Auth');
public function beforeFilter() {
parent::beforeFilter();
//Basic Auth
$this->Auth->authenticate = array('Basic');
}
これで、Hogeコントローラーにはベーシック認証がかかる。
サイト全体にかけたければ、AppControllerのbeforeFilterに同じように書けば良い。
もし、基本見せてもいいが、管理ページは見せたくないって場合は、
<?php
class ManagerAppController extends AppController {
public $components = array('Session','Auth');
public function beforeFilter() {
parent::beforeFilter();
//Basic Auth
$this->Auth->authenticate = array('Basic');
}
}
こんな風に、AppControllerを継承してもう一つ作ったものを継承したコントローラーにすればよいと思う・・・。
(他に、やり方あるらしいけど。)
ちなみに、ベーシック認証は平文でパスワードを送るらしいので、送信経由で盗聴されると、そのままパスワードが見られるらしい。
まぁ、多くの人が、ドアが閉まってればガラスを割って入ろうとは思わないので、ないよりはマシだと思う。