2011-01-24 7 views
7

He implementado páginas seguras antes mediante el uso de una carpeta segura específica (por ejemplo, la carpeta https frente a la carpeta http en el servidor). Empecé a usar Zend Framework y me gustaría que partes de la aplicación (por ejemplo, inicio de sesión) utilizaran https. He buscado en google e incluso aquí, pero no he podido encontrar nada que explique cómo manejar esto. ¿Puedo tener https para controladores/acciones específicos? Gracias.Cómo implementar SSL en Zend MVC

+1

duplicado para [cómo-a-conseguir-sslmod-rewritezend-marco-mvc-trabajo-juntos] (http://stackoverflow.com/questions/380050/how-to-get-sslmod-rewritezend-framework-mvc-working-together) – criticus

Respuesta

13

La manera más limpia es tener un archivo .ini para la configuración SSL donde se puede habilitar el soporte SSL para los niveles de modelo/controlador/acción, así:

Digamos que usted tiene un módulo/controlador/acción como esto:
SSLModule-> IndexController-> testAction

 

## ini file (can be config.ini also) 
ssl.modules.SSLModule.require_ssl = true //-> entire module requires SSL 
ssl.modules.SSLModule.Index.require_ssl = true //-> entire controller requires SSL 
ssl.modules.SSLModule.Index.test.require_ssl = true //-> single action requires SSL 
 

se analiza este ya sea a través de configuración, o por separado, y en su archivo de arranque que puede incluir una controllerplugin, como el mío aquí.

Hay muchas otras maneras de hacerlo, ¡pero creo que se entiende la idea!

 

class Application_Controllerplugins_Ssl extends Zend_Controller_Plugin_Abstract 
{ 

    public function preDispatch (Zend_Controller_Request_Abstract $request) 
    { 

     $shouldSecureUrl = false; 

     //get the config settings for SSL 
     $options = Application_ServiceManager::getConfig()->ssl; 

     //if config is empty, exit 
     if (!is_object($options)) 
      return; 

     //simpler to use  
     $options = $options->toArray(); 

     //only use it production environment 
     if (APPLICATION_ENV == 'production') 
     { 

      if (

       (isset($options['modules'][$request->module]['require_ssl']) && $options['modules'][$request->module]['require_ssl']) || 
       (isset($options['modules'][$request->module][$request->controller]['require_ssl']) && $options['modules'][$request->module][$request->controller]['require_ssl']) || 
       (isset($options['modules'][$request->module][$request->controller][$request->action]['require_ssl']) && $options['modules'][$request->module][$request->controller][$request->action]['require_ssl']) 

      ) 
      { 

       $shouldSecureUrl = true; 

      } 

      if ($shouldSecureUrl) 
      { 

       $this->_secureUrl($request); 

      } 
     } 
    } 


    protected function _secureUrl (Zend_Controller_Request_Abstract $request) 
    { 

     $server = $request->getServer(); 
     $hostname = $server['HTTP_HOST']; 

     if (! $request->isSecure()) 
     { 
      $url = Zend_Controller_Request_Http::SCHEME_HTTPS . "://" . $hostname . 
      $request->getPathInfo(); 

      $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
      $redirector->setGoToUrl($url); 
      $redirector->redirectAndExit(); 
     } 
    } 
} 
 

me olvidó mencionar: añadirlo en su archivo de arranque:

 

$Zend_Controller_Front->registerPlugin(new Application_Controllerplugins_Ssl()); 
 
+3

Funcionó como un amuleto. Muchas gracias, contribución muy valiosa. – jgnasser

Cuestiones relacionadas