14時の間食

CakePHPの記事を中心にWeb制作について

CakePHP2.xでSSL接続(https://)を強制させる

CakePHP

    利用するのはSecurityコンポーネント。 CakePHPにもともと備わっているコンポーネントなので他所からのDLなどは一切不要です。

    コントローラーに数行記述するだけ。

    このお手軽さ。まずは、SSL接続を強制したいアクションのあるコントローラーで、Securityコンポーネントの使用を宣言します。

    public $components = array('Security');
    

    beforeFilter内に以下の記述を追加します。
    ここではif文を使い、アクションがindexの時のみSSL接続が強制されるように設定しています。
    コントローラー内の全てのアクションにSSL接続を強制したい時はこのif文は取り払って下さい。

    public  function beforeFilter(){
    
        //indexのみSSL接続を強制
        if ($this->action === 'index') {
            $this->Security->blackHoleCallback = 'forceSSL';
            $this->Security->requireSecure();
        }
    }
    

    最後にforceSSLメソッドを追加します。このままコピペでOK。

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

    以上をまとめるとこんな感じ。↓

    class HogesController extends AppController {
    
        public $components = array('Security');
    
        public  function beforeFilter(){
    
            //SSLを強制するアクションを設定
            if ($this->action == 'index') { //←アクション名がindexの時だけSSL接続を強制
                $this->Security->blackHoleCallback = 'forceSSL';
                $this->Security->requireSecure();
            }
        }
        public function forceSSL() {
            $this->redirect('https://' . env('SERVER_NAME') . $this->here);
        }
    
        public function index() {
    
        }
    }
    

    SSLを使わないページにはむしろhttp://を強制したい…という場合

    このままだと、https://のページからのリンクは絶対パスで「http://」と指定しない限り全てhttps://になってしまいます。
    SSLが必要ないページでSSL接続を解除したい場合は、_unforceSSL()などといったメソッド作ってSSLが不要のアクションにhttps://でアクセスが来た時に実行されるようにします。
    以下明滅している部分が、追加したコードです。

    class HogesController extends AppController {
    
        public $components = array('Security');
    
        public  function beforeFilter(){
    
            //SSLを強制するアクションを設定
            if ($this->action == 'index') { //←アクション名がindexの時はSSL接続を強制
                $this->Security->blackHoleCallback = 'forceSSL';
                $this->Security->requireSecure();
            }elseif(env('HTTPS')){ //←アクション名がindex以外なのにURLがhttps://だったらhttp://にリダイレクト//+
                $this->_unforceSSL();//+
            }//+
        }
        public function forceSSL() {
            $this->redirect('https://' . env('SERVER_NAME') . $this->here);
        }
        public function _unforceSSL() {//+
            $this->redirect('http://' . env('SERVER_NAME') . $this->here);//+
        }//+
    
        public function index() {
    
        }
    }
    

    ※参考記事はこちら
    http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html

    カテゴリー

    最近の記事

    Author

    • ささきち-このブログを書いてる人
      s3make@ささきち
      多摩川沿いに住むフリーのWebデザイナーです。近所のイオンによく行きます。