いまさらSecurityComponent::requireSecure()がCakeRequest::is('ssl')で判定していることに気づいた

AWSのELB/SSL Termination配下や、ロードバランサ配下にCakePHPなシステムを設置するとき、 なんとなく SecurityComponent::requireSecure() を使わず、独自のSslComponentをつくることが多かったのですが、

これはSSLの判定条件がELB/SSL Termination配下だったりすると、

  • (そのままだと) SecurityComponent::requireSecure() が動かない
  • SSLの判定条件を変更する必要がある

という2つの事象が発生するためで、特に大きな理由はありませんでした。まあ、全く考えていなかったです。

もともとCakePHP1.3系のころから使っているSslComponentのロジックがあったので、それでいいかな。とずっと思っていました。

そろそろまとめたい

で、様々な要因が重なって「そろそろSSL判定用のプラグインを作っとくか」と作ったら、

kozoから「CakeRequestと連動できるんじゃね?」と、一言。

CakeRequest::is(***) はdetectorを1つしか当てられないのですが、 callback で判定ロジックを渡すことができるので、これを利用して、Pluginの機構からうまく CakeRequest::is('ssl') の判定ロジックを拡張できました。

github.com

ふとSecurityComponent::requireSecure() の処理を追ってみた

「そういや SecurityComponent::requireSecure() はどうなっているだっけ?」 となんとなく処理を追ってみたら、 当然かのように CakeRequest::is('ssl') が利用されており、図らずして Yassl pluginで SecurityComponent::requireSecure() の判定ロジックが拡張され、 ELB配下でも使えるようになりました。

というわけで

CakePHPソースコードを読み込んでいないことが実感できました。。。