tag name php symfony redirect twig access-control

php - name - ¿Cuál es la mejor manera de notificar a un usuario después de que una regla de access_control redirige?



get tag name wordpress (3)

De los documentos de seguridad de Symfony 2.3 :

Si se niega el acceso, el sistema intentará autenticar al usuario si aún no lo ha hecho (por ejemplo, redirigir al usuario a la página de inicio de sesión) . Si el usuario ya ha iniciado sesión, se mostrará la página de error 403 "acceso denegado". Consulte Cómo personalizar las páginas de error para obtener más información.

Actualmente estoy usando una regla de access_control para algunas rutas. Me gustaría notificar a un usuario anónimo si se redirige a la ruta de inicio de sesión con un mensaje como " Debe iniciar sesión para acceder a esa página ". He leído los documentos de seguridad varias veces y no he encontrado nada relevante para esto. ¿Estoy pasando por alto algo?

De lo contrario, ¿cuál sería la mejor manera de notificar al usuario cuando una regla de access_control solo si se les redirige al inicio de sesión (es decir, no si solo están en un rol no autorizado )?

EDITAR: Para aclarar, estoy preguntando específicamente cómo verificar si una redirección fue causada por una regla de access_control (de preferencia si es posible).


¿No podrías simplemente tener dos rutas de inicio de sesión?

Por ejemplo, en el conjunto de configuración de seguridad.

form_login: login_path: /login_message

En su controlador de inicio de sesión

/** * @Template() * @Route("/notauthorized", name="login_message") */ public function loginMessageAction() { return []; }

Y luego en su loginMessage.html.twg

<a href="{{ path(''login'') }}">You must login to access this page.</a>


Creo que un oyente kernel.exception y establecer un mensaje flash pueden hacerlo. Ejemplo no probado:

use Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent; use Symfony/Component/HttpFoundation/Response; use Symfony/Component/HttpFoundation/Session/SessionInterface; use Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException; class My403ExceptionListener { protected $session; public function __construct(SessionInterface $session) { $this->session = $session; } public function onKernelException(GetResponseForExceptionEvent $event) { $exception = $event->getException(); if ($exception instanceof AccessDeniedHttpException) { $this->session->getFlashBag()->set(''warning'', ''You must login to access that page.''); } } }

Realmente no sé si funciona o si es lo correcto. Puedes registrarlo como kernel.event_listener . O tal vez es mejor que consigas un servicio dedicado y lo configures como el parámetro de access_denied_handler en la configuración del firewall . Creo que hay muchas maneras posibles.


Entonces, después de un poco de investigación, encontré la manera correcta de hacer esto. Deberá usar un servicio de Punto de entrada y definirlo en la configuración de su firewall.

Este método no afectará su configuración de página predeterminada especificada en su configuración de firewall para iniciar sesión.

El código

seguridad.yml:

firewalls: main: entry_point: entry_point.user_login #or whatever you name your service pattern: ^/ form_login: # ...

src / Acme / UserBundle / config / services.yml

services: entry_point.user_login: class: Acme/UserBundle/Service/LoginEntryPoint arguments: [ @router ] #I am going to use this for URL generation since I will be redirecting in my service

src / Acme / UserBundle / Service / LoginEntryPoint.php:

namespace Acme/UserBundle/Service; use Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryPointInterface, Symfony/Component/Security/Core/Exception/AuthenticationException, Symfony/Component/HttpFoundation/Request, Symfony/Component/HttpFoundation/RedirectResponse; /** * When the user is not authenticated at all (i.e. when the security context has no token yet), * the firewall''s entry point will be called to start() the authentication process. */ class LoginEntryPoint implements AuthenticationEntryPointInterface { protected $router; public function __construct($router) { $this->router = $router; } /* * This method receives the current Request object and the exception by which the exception * listener was triggered. * * The method should return a Response object */ public function start(Request $request, AuthenticationException $authException = null) { $session = $request->getSession(); // I am choosing to set a FlashBag message with my own custom message. // Alternatively, you could use AuthenticationException''s generic message // by calling $authException->getMessage() $session->getFlashBag()->add(''warning'', ''You must be logged in to access that page''); return new RedirectResponse($this->router->generate(''login'')); } }

login.html.twig:

{# bootstrap ready for your convenience ;] #} {% if app.session.flashbag.has(''warning'') %} {% for flashMessage in app.session.flashbag.get(''warning'') %} <div class="alert alert-warning"> <button type="button" class="close" data-dismiss="alert">&times;</button> {{ flashMessage }} </div> {% endfor %} {% endif %}

Recursos: