2013-09-11 8 views
0

Я использую AuthComponent из ядра cakephp. Поэтому я использую метод isAuthorized() для проверки любого запроса. Для «нормальных» запросов это работает очень хорошо - когда isAuthorized() возвращает false, пользователь перенаправляется на «откуда он пришел», и с помощью setFlash я могу отобразить сообщение о том, что проблема авторизации (если я хочу) ,Как правильно использовать isAuthorized() из AuthComponent cakephp в AJAX-звонках

Но когда дело доходит до запросов AJAX, это не имеет никакого смысла. Ответ будет тогда страницей, на которой пользователь в настоящее время находится как responseetext ... Что мне больше всего нравится: если авторизация завершилась с ошибкой ajax-вызова, отправьте ответ со статусом 400 (или что-то еще), и просто сообщение «не разрешено потому что вы не администратор »(или что-то еще).

Есть ли простой способ достичь этого?

Единственное временное решение, которое приходит мне на ум, заключается в создании контроллера, особенно для всех запросов ajax. В его isAuthorized() - Method он (если авторизация не работает) перенаправляет на действие с 1 параметром (сообщение об ошибке), и это действие отображает только это сообщение. Но (не говоря уже о том, что я не знаю, будет ли это вообще работать, если перенаправление, если возможно, isAuthorized(), но, я думаю, это будет), что кажется довольно ... грязным/неряшливым для меня. Так кто-то знает более легкий/чистый способ?

Буду рад любым идеям!

ответ

2

Вы можете установить JSON ответ с HTTP 401 код и завершить процесс, как это:

public function isAuthorized($user) { 
    if(...) { 
     // Auth fails 
     if($this->request->is('ajax')) { 
      $this->response->type('json'); 
      $this->response->statusCode(401); 
      $this->response->body(json_encode(array('status' => 'ERROR', 'message' => 'Unauthorized'))); 
      $this->response->send(); 
      $this->_stop(); 
     } 
    } 
} 

В теле ответа вы также можете установить URL, где вы хотите, чтобы перенаправить пользователя. Обработайте это перенаправление с помощью javascript.

+0

Спасибо большое, отлично работает! То, что я сейчас делаю, заключается в том, что в try-block выполняется почти вся функцияAuthorized-function, если авторизация не выполняется, я не сразу возвращаю false, но генерирую исключение; то в блоке catch я проверяю, является ли запрос ajax или нет, в первом случае я использую код, который вы указали мне выше, иначе я просто использую setFlash. – jwulf

Смежные вопросы