symfony2 Нет перенаправления на ограниченные зоны - PullRequest
7 голосов
/ 01 февраля 2012

Мой файл безопасности настроен следующим образом:

security:
...
            pattern:    ^/[members|admin]
            form_login:
                check_path: /members/auth
                login_path: /public/login
                failure_forward: false
                failure_path: null
            logout:
                path:   /public/logout
                target: /

В настоящее время, если я получаю доступ к URL-адресу участника без аутентификации, он перенаправляет меня на /public/login, но я не хочу, чтобы он перенаправлял.Я в основном отвечаю с помощью json на своих контроллерах, поэтому я просто хочу показать предупреждение по ограниченному URL, например {"error": "Access denied"}.Если я возьму код login_path: /public/login, он будет перенаправлен на URL / логин по умолчанию.Как мне сделать, чтобы остановить его от перенаправления?

Ответы [ 3 ]

9 голосов
/ 23 октября 2013

Вам нужно создать Слушатель, а затем вызвать ваш ответ.Мое решение основано на - https://gist.github.com/xanf/1015146

Код слушателя -

namespace Your\NameSpace\Bundle\Listener;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

class AjaxAuthenticationListener
{

/**
 * Handles security related exceptions.
 *
 * @param GetResponseForExceptionEvent $event An GetResponseForExceptionEvent instance
 */
public function onCoreException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();
    $request = $event->getRequest();

    if ($request->isXmlHttpRequest()) {
        if ($exception instanceof AuthenticationException || $exception instanceof AccessDeniedException || $exception instanceof AuthenticationCredentialsNotFoundException) {
            $responseData = array('status' => 401, 'msg' => 'User Not Authenticated');
            $response = new JsonResponse();
            $response->setData($responseData);
            $response->setStatusCode($responseData['status']);
            $event->setResponse($response);
        }
    }
}
}

Вам необходимо создать службу для слушателя -

e_ent_int_baems.ajaxauthlistener:
    class: Your\NameSpace\Bundle\Listener\AjaxAuthenticationListener
    tags:
      - { name: kernel.event_listener, event: kernel.exception, method: onCoreException, priority: 1000 }
6 голосов
/ 03 сентября 2013

Вы можете сделать, как я: в security.yml

firewalls:
        administrators:
            pattern: ^/
            form_login:
                check_path:  _security_check
                login_path:  _security_login
            logout: true
            security: true
            anonymous: true
            access_denied_url: access_denied

в routing.yml

access_denied:
    path: /error403
    defaults :
        _controller: FrameworkBundle:Template:template
        template: 'DpUserBundle:Static:error403.html.twig'

просто добавить в раздел брандмауэра * access_denied_url * param

0 голосов
/ 02 февраля 2012

См. на этой странице для полного security.yml справочника конфигурации.Кроме того, это еще лучшая ссылка с пояснениями для каждого ключа.

Я бы предложил создать собственный класс слушателя для обработки возврата JSON, когда пользователю необходимо войти в систему.Пример: https://gist.github.com/1015146

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