Conexiones HTTP seguras (https) en CakePHP 1.2

Para el desarrollo de conexiones seguras de nuestra página web, vamos a utilizar un método que hemos visto en el weblog de Tanveer. Lo normal es que necesitemos que algunas de las páginas de la web sean seguras, como pueden ser formularios de contratación de servicios, y otras no lo sean, por ejemplo páginas simples de información de dichos servicios. Por lo que desarrollaremos un sistema que nos permita hacer el cambio entre unas y otras.

Utilizamos para implementar este mecanismo el componente de la Bakery de CakePHP para forzar conexiones seguras, y lo utilizaremos de la misma manera que se explica en este artículo, pero añadiéndole la funcionalidad inversa. Lo explicaremos paso a paso:

- Añadimos el componente ssl.php, en la carpeta app/controllers/components/ con el siguiente contenido:

<?php
class SslComponent extends Object {

   var $components = array('RequestHandler');

   var $Controller = null;

   function initialize(&$Controller) {
      $this->Controller = $Controller;
   }

   function force() {
      if(!$this->RequestHandler->isSSL()) {
        $this->Controller->redirect('https://'.$this->__url());
      }
   }

   function unforce() {
      if($this->RequestHandler->isSSL()) {
         $this->Controller->redirect('http://'.$this->__urll());
      }
   }

   function __url() {
      $port = env('SERVER_PORT') == 80 ? '' : ':'.env('SERVER_PORT');
      return env('SERVER_NAME').$port.env('REQUEST_URI');
   }

   function __urll() {
      $port = env('SERVER_PORT') == 443 ? '' : ':'.env('SERVER_PORT');
      return env('SERVER_NAME').$port.env('REQUEST_URI');
   }

}
?>

- Añadimos en el app_controller (cake/libs/controlller/app_controller.php) la redirección a conexión segura para aquellas acciones que nos interese. Ésta es otra diferencia con el artículo de la Bakery, ya que en ésta se hace esa redirección desde cada acción de cada controlador.

<?php
class AppController extends Controller {

   var $components = array( 'Ssl' );

   public function beforeRender(){
      $action = array( 'action1', 'action2' );
      if( in_array( $this->params['action'] , $action ) ){
         $this->Ssl->force();
      }else{
         $this->Ssl->unforce();
      }
   }

}
?>

Podríamos cambiar en este punto la condición por la que nos interese para nuestro caso, por ejemplo, que sean controladores (todas las acciones de ese controlador) los que necesiten añadir este tipo de conexión.

Escribir una respuesta