Задать вопрос
okwinza
@okwinza
PHP Developer

Как спрятать роут от залогиненных юзеров в Symfony2?

Имеем стандартный инсталл SF 2.7 + FOSUB 2.0 ветки.
Нужно настроить редирект на homepage( / ) с /auth/ если юзер залогинен.

Firewall практически дефолтный:
firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        # secures part of the application
        main:
            pattern: ^/
            form_login:
                login_path: /auth/login
                check_path: /auth/login_check

                provider: fos_userbundle
                default_target_path:  /
                csrf_provider: security.csrf.token_manager

            logout:
                path:   /auth/logout
                target: /
                invalidate_session: true
            anonymous:    true

    access_control:
        - { path: ^/admin/, role: ROLE_ADMIN }
        - { path: ^/, role: ROLE_USER }


Пока на ум приходит только вариант с дополнительным правилом в access_control:
- { path: ^/auth/,  allow_if: "!is_fully_authenticated()" }

И созданием листенера, который бы отлавливал AccessDeniedException, чекал текущий роут и производил редирект куда надо. Но имхо это лютый оверхед для такой базовой задачи.

UPD: Решил оставить EventListener:
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Router;

class AccessDeniedListener {
    
    protected $_session;
    protected $_router;
    protected $_request;

    public function __construct(Session $session, Router $router, Request $request){
        $this->_session = $session;
        $this->_router  = $router;
        $this->_request = $request;
    }

    public function onAccessDeniedException(GetResponseForExceptionEvent $event) {

        if ($event->getException() instanceof AccessDeniedHttpException){
            $this->_session->getFlashBag()->add('error', 'Access Denied. You do not have permission to access this page.');

            if ($this->_request->headers->get('referer')){
                $route = $this->_request->headers->get('referer');
            } else {
                $route = $this->_router->generate('starlight_home');
            }

            $event->setResponse(new RedirectResponse($route));
        }
    }
}

Services.yml:
services:
    starlight.access_denied_listener:
        class: okwinza\AppBundle\EventListener\AccessDeniedListener
        arguments: ["@session", "@router", "@=service('request_stack').getCurrentRequest()"]
        tags:
            - { name: kernel.event_listener, event: kernel.exception, method: onAccessDeniedException }
  • Вопрос задан
  • 539 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
nonlux
@nonlux
Вообще я похоже делал
security.yml
        -
            path: ^/register
            allow_if: "!has_role('ROLE_USER')"


+ кастомизируем 403 станицу на перенаправление
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@romashka_sky
Почему просто не переопределить контроллер FOSUserBundle:Security:login, добавив туда функциональность редиректа
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы