2011-12-06 9 views
9

Necesito ejecutar algún código antes de verificar si las credenciales de un usuario son correctas. Actualmente estoy logrando esto con un detector de eventos personalizado que se activa en el evento kernel.request y comprueba si la URL solicitada coincide con la configuración de security.yml check_path. Pero esto es ineficiente ya que se ejecuta en cada solicitud. Soy consciente del evento onSecurityInteractiveLogin, pero creo que se dispara después de un intento de inicio de sesión exitoso. ¿Alguien sabe si hay un evento de inicio de sesión previo, o donde podría enviar un evento personalizado yo mismo?¿Hay algún tipo de evento de "inicio de sesión previa" o similar?

Respuesta

12

Por lo tanto, no hay ningún evento de inicio de sesión 'oficial'. Pero afortunadamente no es difícil configurar uno ya que Symfony2 es tan ampliable. El truco es usar su propio servicio para manejar la autenticación.

Symfony utiliza esta clase cuando se utiliza un formulario de entrada:

Symfony\Component\Security\Http\Firewall\UsernamePasswordFormAuthenticationListener

Si anula el security.authentication.listener.form.class parámetro (definida originalmente en Symfony\Bundle\SecurityBundle\Resources\config\security_listeners.xml) se puede utilizar un receptor personalizado que se extiende UsernamePasswordFormAuthenticationListener.

Todo lo que queda por hacer es anular el método attemptAuthentication() para enviar el evento personalizado.

(En realidad también es necesario para almacenar el despachador de eventos como una propiedad de clase en __construct())

Este método debería funcionar con otros métodos de autenticación - todo lo que tenía que hacer es modificar el oyente apropiado (es decir BasicAuthenticationListener, X509AuthenticationListener, etc.)

+0

me puede dar un ejemplo, ya que no sé por dónde empezar. – pregmatch

+0

Implementé esta sugerencia con estos pasos: 1) agrego una línea "security.authentication.listener.form.class: App \ BoardBundle \ Listener \ MyAuthListener" en su config.yml, sección de parámetros 2) realmente creo esta clase class MyAuthListener extends UsernamePasswordFormAuthenticationListener {3) en él, crea la función protegida AtteAuthentication (Request $ request) – user1312695

Cuestiones relacionadas