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です。


参考
CakePHPBasic認証対応ページを作る
 http://blog.katsuma.tv/2008/07/cakephp_basic_auth.html