Защищенное соединение (SSL/HTTPS) для сайта на CakePHP
Недавно в одном проекте над которым я работаю возникла необходимость для всего сайта принудительно использовать защищенный протокол Https. Как всегда фреймворк CakePHP позволил сделать это с минимальными затратами.
Для начало необходимо подключить Security компонент. Для тех кто забыл или не помнит как это делается напомню:
<?php class AppController extends Controller { var $components = array('Security'); } ?>;
Теперь создадим метод «forceSSL» который будет перенаправлять пользователей которые набрали адрес сайта в браузере без https://
<?php class AppController extends Controller { var $components = array('Security'); function forceSSL() { $this->redirect('https://' . env('SERVER_NAME') . $this->here); } } ?>;
И последним шагом будет задать условие при котором будет использоваться наш новый метод.
Для этого зададим в beforeFilter контроллера функцию обратного вызова в Seciruty компоненте:
$this->Security->blackHoleCallback = ‘forceSSL’;
и вызовем метод который проверяет используется ли защищенное соединение:
$this->Security->requireSecure();
Весь код целиком:
<?php class AppController extends Controller { var $components = array('Security'); function beforeFilter() { $this->Security->blackHoleCallback = 'forceSSL'; $this->Security->requireSecure(); } function forceSSL() { $this->redirect('https://' . env('SERVER_NAME') . $this->here); } } ?>;
В приведенном примере условие срабатывает для любого контроллера и любого экшена. Этого можно избежать если вызывать метод requireSecure() не в AppController, а только в необходимом. Если передать этому методу аргументы в виде имен экшенов, то условие будет срабатывать только для этих экшенов. К примеру: requireSecure(‘login’, ‘register’).