Работа с ошибкой Zend Authentication через запрос AJAX - PullRequest
5 голосов
/ 02 августа 2010

В настоящее время я использую плагин Zend Controller для проверки подлинности. Следующее, вероятно, выглядит знакомым:

class SF_Plugin_Member_Auth extends Zend_Controller_Plugin_Abstract {

    public function preDispatch(Zend_Controller_Request_Abstract $request) {

        if (!SF_Auth::getInstance('Member')->hasIdentity()) {
            if ($request->getControllerName() !== 'auth' && $request->getControllerName() !== 'error') {
                $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
                $r->gotoSimpleAndExit('login', 'auth', $request->getModuleName());
            }
        }
    }
}

В чем я не уверен, так это в наилучшем способе обработки запроса AJAX, который не прошел проверку подлинности. Допустим, кто-то пытается войти в систему, используя форму, отправленную через AJAX. Как Javascript должен знать, что ему действительно нужно перенаправить пользователя на страницу входа?

Моя первая мысль - проверить, является ли запрос запросом AJAX, а затем отобразить объект JSON с подробными сведениями о том, куда перенаправить пользователя. Затем JavaScript может найти определенное свойство в возвращенном объекте JSON и использовать его в качестве URL-адреса для «location.href» пользователя.

С указанным выше связаны две проблемы:

  1. Я не уверен, как остановить отправку запроса - все, что я хочу сделать, это вывести простую строку JSON, если это запрос AJAX.
  2. Это не похоже на Zend-подобный способ делать вещи.

Есть ли кто-нибудь, кто натолкнулся и решил этот самый сценарий?

Большое спасибо,

Джеймс.

1 Ответ

1 голос
/ 05 августа 2010

Вы можете установить значения json в объекте ответа и корректно остановить запрос с помощью перенаправителя.

if (!SF_Auth::getInstance('Member')->hasIdentity()) {
    if ($request->getControllerName() !== 'auth' && $request->getControllerName() !== 'error') {
        if ($request->isXmlHttpRequest()) {
            $json = Zend_Json::encode(array('auth' => false, 'url' => 'http://foo.bar/login'));

            // Prepare response
            $this->getResponse()
                 ->setHttpResponseCode(200) // Or maybe HTTP Status 401 Unauthorized
                 ->setBody($json)
                 ->sendResponse();

            // redirectAndExit() cleans up, sends the headers and stopts the script
            Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')->redirectAndExit();
        } else {        
            $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
            $r->gotoSimpleAndExit('login', 'auth', $request->getModuleName());
       }
    }
}

Это выведет что-то вроде этого:

{"auth":false,"url":"http:\/\/foo.bar\/login"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...