2015-06-27 6 views
6

Я пытаюсь предотвратить перенаправление на страницу входа, когда пользователь пытается получить доступ к странице без токена, у меня есть одностраничное приложение, и я просто помещаю запросы ajax под брандмауэр и когда пользователь делает Ajax без маркеров я хочу Аякс вернуть запрещенное исключение так что я буду иметь возможность поймать его в стороне клиентаsymfony2 security - отключить логин и показать запрет

в настоящее время Аякс возвращает «найдены» с просьбы перенаправляются на страницу входа

Я не нашел решения в кулинарной книге, пока я не хочу использовать токены api, отправляю исключение вместо перенаправления на логин

ответ

7

Вам необходимо определить entry_point на ваш брандмауэр, чтобы вы могли вернуть неавторизованный ответ. Информацию о точках входа можно найти в документации here. Я скопирую этот параграф в случае будущих запросов здесь.

Когда пользователь не аутентифицирован вообще (то есть, когда в хранилище токенов еще нет токена), точка входа в брандмауэр будет вызываться для «запуска» процесса аутентификации. Точка входа должна реализовывать AuthenticationEntryPointInterface, которая имеет только один метод: start(). Этот метод получает текущий объект Request и исключение, из которого был вызван прослушиватель исключений. Метод должен возвращать объект Response. Это может быть, например, страница, содержащая форму входа или, в случае базовой HTTP-аутентификации, ответ с заголовком WWW-Authenticate, который будет предлагать пользователю указать свое имя пользователя и пароль.

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

Он должен выглядеть следующим образом:

namespace MyBundle\Service; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 

class CustomEntryPoint implements AuthenticationEntryPointInterface 
{ 

    public function start(Request $request, AuthenticationException $authException = null) 
    { 
     $response = new Response("", Response::HTTP_UNAUTHORIZED); 

     return $response; 
    } 

} 

И в файле services.yml

services: 
    service.entry_point: 
     class: MyBundle\Service\CustomEntryPoint 

И, наконец, передать идентификатор службы service.entry_point к вашему entry_point опции в firewall разделе security.yml файла.

Это должно сделать трюк.

+0

Можно ли отключить auth с помощью 'entry_point'? –