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を継承してもう一つ作ったものを継承したコントローラーにすればよいと思う・・・。
(他に、やり方あるらしいけど。)
ちなみに、ベーシック認証は平文でパスワードを送るらしいので、送信経由で盗聴されると、そのままパスワードが見られるらしい。
まぁ、多くの人が、ドアが閉まってればガラスを割って入ろうとは思わないので、ないよりはマシだと思う。