スポンサードリンク

CakePHP
CakePHP

以前、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にエラー判別の仕方が載ってました。

Security

こうするとタイプ別でえら表示ができる

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
   }
}

引数にエラータイプを指定すれば

エラータイプによって

動作を振り分けられます。

これでトークンエラーの際に

エラーぺージを表示させることができました。

スポンサードリンク