Securityコンポーネントを使うときの注意点と特定アクションにBASIC認証をかける
CakePHP 1.2 RC3を利用しています。
Securityコンポーネントを使うと、Admin用コントローラやアクションのみにBASIC認証をかけるとかできて、色々と便利です。
その他にも、コンポーネントとして読み込むだけでフォームにトークンを埋め込んで、埋め込んだトークンがPOSTデータに含まれていないとエラーとして扱ってくれるなど、自然にCSRF対策が出来て便利です。
ただし、Viewファイルの中で、Cakeのformヘルパーを使ってフォームタグとフォームを閉じるタグを出力しないと、トークンを自動で埋め込んでくれないのでPOSTデータはすべてエラー扱いにされてしまいます。
最初、フォームを閉じる場合に、htmlのフォームタグを使って</form>としていてエラーになりはまりました。
フォームは下記のように
<?php echo $form->create('Admin', array( 'url' => '/admin/index' ) );?> <?php echo $form->input( 'loginid' , array('label' => false, 'size' => 15, 'maxlength' => 20 ) ); ?> <?php echo $form->password( 'password' , array('label' => false, 'size' => 15, 'maxlength' => 20 ) ); ?> <input name="login" type="image" src="/img/login.gif" alt="ログイン" onClick="#" /> <?php echo $form->end(); ?>
として、フォームの開始と終了を、create, endを呼び出しておく必要があります。
これで、例えばこのコントローラのアクションにBASIC認証をかけたい場合は、
class AdminController extends AppController { var $name = 'Admin'; var $uses = array('Admin'); var $helpers = array('Html', 'Form'); var $components = array('Security'); function beforeFilter(){ parent :: beforeFilter(); //下記ですべてのアクションにBASIC認証をかける $this->Security->loginOptions = array('type'=>'basic'); $this->Security->loginUsers = array( BASIC_ADMIN_ID => BASIC_ADMIN_PW ); $this->Security->requireLogin('*'); } function index(){ if( !empty( $this->data ) ){ pr($this->data);exit; } } function hoge(){ } }
このようにすればOKです。
これで/admin/indexや/admin/hogeにアクセスすればBASIC認証画面が出ます。BASIC認証のID/PWはloginUsersにID/PWの連想配列を渡せばOKです。
参考
CakePHPでBasic認証対応ページを作る
http://blog.katsuma.tv/2008/07/cakephp_basic_auth.html