スポンサードリンク
以前、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 } }
引数にエラータイプを指定すれば
エラータイプによって
動作を振り分けられます。
これでトークンエラーの際に
エラーぺージを表示させることができました。
スポンサードリンク