ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

CakePHPでSecurityコンポーネントを使った時の不具合

スポンサードリンク

http://www.flickr.com/photos/63775128@N00/2984381240
photo by koyhoge



このタイトルで調べてみると、みんな結構苦労していることがわかります。


CakePHPSSLに対応が必要になった。また、HttpのアクセスをHttpsへリダイレクトもしたい。


っつーわけで、Securityコンポーネントを読み込むようにしました。


が、


障害発生!!!


Post送信や、Ajaxがうまくいかなくなった!!!


AppController.phpで、PostやAjaxを許可するようにすればおk.


  • app/Controller/AppController.php
<?php
function beforeFilter() {
    $this->Security->blackHoleCallback = "securityError";
    $this->Security->requireAuth('login');

    // これを追加
	$this->Security->validatePost = false; // Post
	$this->Security->csrfCheck = false;   // Ajax
}

function securityError() {
	$this->redirect('https://' . env('SERVER_NAME') . $this->here);
}

と、ここまではテンプレ。ぐぐったら結構見つかります。


私の体験した障害はまだまだおわらんよ。


実はこれを適応したあともうまくいかないエラーが発生し続けました。

The request has been black-holed


しかも! 発生するページと発生しないページが存在する・・・!


/(^o^)\ナンテコッタイ ってやっている間に原因を特定しました。

  • ChildController.php
<?php

public function beforeFilter() {
	// 〜なんらかの処理〜
}

あぁ、、、、



あぁああ!


オーバーライドしている・・・!(°ω°;


どうやら、発生するページのControllerは、beforeFilterをオーバーライドしているので、通信の許可がなくっているらしい。


なので、修正しました。

  • ChildController.php
<?php

public function beforeFilter() {
	// AppControllerの情報を先に呼び出す
	parent::beforeFilter();

	// 〜なんらかの処理〜
}


これで大丈夫。。。めちゃくちゃ焦りました。。。。。orz