Я пытаюсь перенаправить, если пользователь не вошел в систему (работает с FOSUser и SonataAdmin) и вызывает либо http://domain.com/app_dev.php
(dev) или http://domain.com
(Prod), то я хочу в обоих случаях перенаправить на /login
поэтому я написал этот конфиг на app/routing.yml
:
root:
path: /
defaults:
_controller: FrameworkBundle:Redirect:urlRedirect
path: /login
permanent: true
Это работает, но у меня есть проблема, так как у меня это в контроллере:
/**
* @param Request $request
*
* @return array
* @Route("/", name="brand")
* @Method("GET")
* @Template()
*/
public function indexAction(Request $request)
{
....
}
Потом когда я пытаюсь позвонить brand
маршрут в соответствии с примером, используя ссылку как: http://domain.com/app_dev.php/?email=7x-xRFClkjw
(dev) или http://domain.com/?email=7x-xRFClkjw
(прод) я был перенаправлен на /login
, Моя лучшая идея — изменить мой код на это:
/**
* @param Request $request
*
* @return array
* @Route("/bp", name="brand")
* @Method("GET")
* @Template()
*/
public function indexAction(Request $request)
{
....
}
А потом перенаправление с использованием маршрута к новому /bp
вместо /
для этой функции (это главным образом потому, что у пользователей уже есть тонна электронных писем, на которых были ссылки, как ранее, и я не могу это изменить). Но я не знаю, как написать это правило в routing.yml
потому что если бы я написал это:
bp:
path: /
defaults:
_controller: FrameworkBundle:Redirect:redirect
route: brand
permanent: true
Я закончу с петлей перенаправления. Я мог бы также изменить маршрут по умолчанию /login
Я просто не могу найти нужную документацию. Основная идея этого поста — установить маршрут по умолчанию для /
, Может ли кто-нибудь помочь мне в этом?
Как дополнительная информация, это часть моего security.yml
файл:
firewalls:
...
admin_area:
pattern: ^/
anonymous: ~
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
# the user is redirected here when they need to log in
login_path: /login
# submit the login form here
check_path: /login_check
# login success redirecting options (read further below)
always_use_default_target_path: true
default_target_path: /admin/dashboard
target_path_parameter: _target_path
use_referer: false
failure_path: /admin/dashboard
failure_forward: false
logout:
path: /logout
ОБНОВИТЬ
На самом деле код из @ emmanuel-hdz-díaz дает мне другую идею, и мне не нужно создавать прослушиватель ядра или добавлять много кода, просто сделав это на моем контроллере:
if ($request->query->get('email')) {
...
} else {
return $this->redirect($this->generateUrl('sonata_user_admin_security_login'));
}
Я смог перенаправить пользователя на /login
маршрут.
Создайте специальное исключение, перехватите его в событии kernel.request, перенаправьте оттуда.
Вы должны создать пользовательское исключение, которое вы можете сохранить в своем маршруте в.e.g:
class RouteException extends \Exception{
protected $route;
public function __construct($route){
$this->route = $route;
}
public function getRoute() { return $this->route; }
}
Теперь создайте слушателя, который будет генерировать RedirectResponse
когда он обнаруживает это исключение, например:
class RedirectExceptionListener{
protected $router;
public function __construct(RouterInterface $router){
$this->router;
}
public function onException(GetResponseForExceptionEvent $event){
$e = $event->getException();
if($e instanceof RouteException){
$url = $this->router->generate($e->getRoute());
$event->setResponse(
new RedirectResponse($url);
);
}
}
}
# the service definition
your_listener:
class: RedirectExceptionListener
arguments:
- @router
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
Заметка: ты должен use
пространства имен для используемых классов.
Это в основном то, что вы можете сделать, чтобы перенаправить из любого места в вашем приложении, хотя это выглядит как вонючее использование исключений, поэтому создайте сервис Redirecter
с методом redirect($route)
это создает исключение для вас, поэтому вызывающая служба не будет знать, как осуществляется перенаправление. Redirecter
может выдать исключение или сделать все необходимое для перенаправления на заданный маршрут.
Для получения дополнительной информации о слушателях событий см. Слушатели событий.
Обновить: Именно так Symfony перенаправляет вас на ваш login_path
когда вы не аутентифицированы, смотрите ExceptionListener
Не уверен, что я понимаю, но вы хотите ограничить доступ ко всему сайту? В этом случае просто измените настройки безопасности, никогда не добавляйте перенаправление на вход в систему, потому что он всегда перенаправляет на вход в систему, даже если пользователь вошел в систему. Вот простой пример конфигурации:
security:
firewalls:
main:
pattern: ^/
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: ROLE_USER }
Попробуй это:
В вашем контроллере внутри вашего действия ():
//
$usr = $this->get('security.context')->getToken()->getUser();
if( $usr == 'anon.' )
{
return $this->redirect($this>generateUrl('sonata_user_admin_security_login'));
}
//