« emacs + flymake で Django | トップページ | vimperator clock.jsの点滅をとめた »

2010年7月27日 (火)

CakePHPでSecurityコンポーネントを使ったらPOSTがはまった

限定された小規模な環境で使えるWebアプリをつくる必要が出来たので、CakePHPで開発中。Scaffoldをちょっと捻った感じの要件なのですぐリリースできた。こういう案件にはCakePHPは最適だと思う。

数日後に、一部の画面にログイン機能をつける要件が出てきた。ログイン画面をつくるようなことは求められてなく、BASIC認証でいいということだったのでSecurityコンポーネントでBASIC認証をつけた。これも数行加えるだけで完了。こんなかんじ。

var $components = array('Security');

function beforeFilter(){
        $this->Security->loginOptions = array('type' => 'basic');
        $this->Security->loginUsers = array('user' => 'password');
        $this->Security->requireLogin('admin_index', 'admin_view', 'admin_add', 'admin_edit','admin_delete');
}

BASIC認証は正常に機能しててOK。と思っていたら一部の画面でPOST処理をすると画面が真っ白になる現象が発生。調べてみるとcontrollerの該当actionに到達する前に真っ白になってるみたい。Webサーバーのアクセスログを調べるとPOSTメソッドの時だけ404 not foundになっている。同じURLでもGETの時は200が返ってる。なんのこっちゃ?と思った。

調べてみると、blackHoleに落ちてたみたいだ。確認のため以下のようにしてみた。

var $components = array('Security');

function beforeFilter(){
        $this->Security->loginOptions = array('type' => 'basic');
        $this->Security->loginUsers = array('user' => 'password');
        $this->Security->requireLogin('admin_index', 'admin_view', 'admin_add', 'admin_edit','admin_delete');
        $this->Security->blackHoleCallback = "securityError";
}

function securityError(){
        var_dump("Securty Component raize an error.");
}

これで該当アクションでPOSTしてみると、"Securty Component raize an error."と出力された。やっぱり落ちてるようだ。

どうすればいいかな?と思って調べたらてっく★ゆきろぐさんの記事を発見。まさにこれだった。たしかに該当アクションでは訳あって一部に自前のinput formを使っている。ワンタイムトークンチェックが利用できない状態なわけですね。

完全にform Helperで書き換えようかとも思ったけど、要求と労力のバランスからPOSTのトークンチェックをスルーする事に決めた。beforeFilter() を以下のように修正。

function beforeFilter(){
        $this->Security->loginOptions = array('type' => 'basic');
        $this->Security->loginUsers = array('user' => 'password');
        $this->Security->requireLogin('admin_index', 'admin_view', 'admin_add', 'admin_edit','admin_delete');
        $this->Security->blackHoleCallback = "securityError";

        $this->Security->validatePost = false;
}

とりあえずこれで正常にPOSTされるようになった。
もしかしたら Security::requireAuth() でセキュリティ対策をするアクションを設定して、今回はまったアクションを除外すればいいのかもしれないけど、時間がないのでやってない。あとで思い出したらやってみようと思います。

 

|

« emacs + flymake で Django | トップページ | vimperator clock.jsの点滅をとめた »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/125677/35915801

この記事へのトラックバック一覧です: CakePHPでSecurityコンポーネントを使ったらPOSTがはまった:

« emacs + flymake で Django | トップページ | vimperator clock.jsの点滅をとめた »