Как реализовать SSL в Zend MVC - PullRequest
7 голосов
/ 24 января 2011

Я реализовал защищенные страницы ранее, используя определенную защищенную папку (например, папка https против папки http на сервере). Я начал использовать Zend Framework и хотел бы, чтобы части приложения (например, логин) использовали https. Я искал в Google и даже здесь, но не смог найти ничего, что объясняет, как справиться с этим. Могу ли я иметь https для определенных контроллеров / действий? Спасибо.

1 Ответ

13 голосов
/ 12 апреля 2011

Самый простой способ - иметь INI-файл для конфигурации SSL, в котором можно включить поддержку SSL для уровней модели / контроллера / действия, например:

Допустим, у вас есть модуль / контроллер / действие, подобное этому:
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

Вы анализируете это либо через config, либо отдельно, и в вашем файле Bootstrap вы можете включить плагин контроллера, как мой здесь.

Есть много других способов сделать это, но я думаю, вы поняли идею!


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();
        }
    }
}

Я забыл упомянуть: чтобы добавить его в свой загрузчик:


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...