« 2010年6月 | トップページ | 2010年9月 »

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() でセキュリティ対策をするアクションを設定して、今回はまったアクションを除外すればいいのかもしれないけど、時間がないのでやってない。あとで思い出したらやってみようと思います。

 

| | コメント (0) | トラックバック (0)

2010年7月 4日 (日)

emacs + flymake で Django

久々にDjangoでWebサービスを開発中。
そしたらflymakeでdjangoモジュールのimport errorがいっぱいでた。
しばらく無視してたけど、エラー表示がうざくなったので対策する。

.emacsに以下のように記述。

(progn
  ....
  (setenv "PYTHONPATH" (concat "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/:" (getenv "PYTHONPATH")))
)

環境変数 PYTHONPATH にdjangoモジュールがあるディレクトリのパスを設定する。google_appengine なんかもこの方法でflymakeに認識させる。

設定後、エラーが出なくなりました。site-packagesにパスを通してるのでdjangoだけじゃなくsite-packages下の全てのモジュールが認識されるわけだけど。まあべつにいいか。

| | コメント (0) | トラックバック (0)

« 2010年6月 | トップページ | 2010年9月 »