
以前、SSL常時接続を設定したのですが、
「初めての[CakePHP2.x]での開発、そして挫折するまで日記~その23 SSL常時接続の設定」
ちょっとした疑問がわいてきたので
調べてみました。
Security コンポーネントでの設定
前回こんな感じでAppController.phpに設定したのです。
public function beforeFilter() {
//SSL常時通信
// HTTP でない場合に実行するメソッド名
$this->Security->blackHoleCallback = 'forceSecure';
//SSL接続でない場合はblackHoleを呼ぶ
$this->Security->requireSecure();
}
この7行目のHTTPでないときに実行するメソッドとして
forceSecureというユーザー関数を使用しています。
forceSecureというユーザー関数は以下のように設定しました。
//SSL常時接続
public function forceSecure() {
$this->redirect("https://".env('SERVER_NAME').$this->here);
}
これでSSL常時接続はできるのです。
この設定は、SSL接続でない場合に
//SSL接続でない場合はblackHoleを呼ぶ $this->Security->requireSecure();
の関数によりblackHoleを呼んでくれます。
すると、blackHoleのコールバックに設定した
// HTTP でない場合に実行するメソッド名 $this->Security->blackHoleCallback = 'forceSecure';
このforceSecure関数が呼び出されて
SSL接続にリダイレクトしてくれるという設定になっています。
疑問に思ったことは、他のSecurity コンポーネントエラーは?
なんで疑問に思ったのかというと
この設定だとSecurity コンポーネントでトークンエラーも
同じページにリダイレクトされるということに気づいたんです。
別に問題ないと言えばないのかもしれません。
でも、何となく気持ち悪いな~って思いまして
設定を見直してみました。
エラーのタイプで判別
CakePHPのCookbookにエラー判別の仕方が載ってました。
こうするとタイプ別でえら表示ができる
public function forceSecure($type) {
//SSL接続でない場合
if($type = 'secure'){
$this->redirect("https://".env('SERVER_NAME').$this->here);
}elseif($type = 'csrf'){
//CSRF対策の場合
throw new NotFoundException();//404 not found を return
}
}
引数にエラータイプを指定すれば
エラータイプによって
動作を振り分けられます。
これでトークンエラーの際に
エラーぺージを表示させることができました。
