2012-08-28 9 views
5

Tengo una aplicación en la que tengo un rol de superadminista y varios roles de usuario con diferentes privilegios. Quiero poder suplantar a cualquiera de estos usuarios usando la consulta _switch_user como se muestra en http://symfony.com/doc/current/book/security.html#impersonating-a-user¿Cómo escucha Symfony al _switch_user?

Sin embargo, cuando agrego la consulta al final de mi url, parece que no hace nada. He jugado con esto durante mucho tiempo y no puedo encontrar una solución. Sé que el usuario con el que estoy conectado tiene ROLE_ALLOWED_TO_SWITCH, pero no puedo entender cómo Symfony lo hace.

Estoy usando un proveedor de autenticación personalizado, así que creo que tiene algo que ver con eso, pero no estoy seguro de lo que necesito ver. Puedo publicar cualquier código necesario, pero realmente no estoy seguro de qué publicar en este momento.

Respuesta

4

Así que busqué más y descubrí que la clase Listener para mi proveedor de autenticación personalizado no se escribió correctamente. Fue escrito de tal manera que se creó un nuevo Token en cada carga de página.

Como resultado, hubo que hacer dos cosas.

El primero fue cambiar el oyente de autenticación para que sea similar a los del Symfony Firewall Listeners, cuya estructura general se muestra a continuación.

if (null !== $token = $this->securityContext->getToken()) { 
    if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() && 
     $token->getUsername() === $username) { 
      return; 
    } 
} 

Estos oyentes básicamente permiten que la autenticación continúe sin crear un token nuevo si se cumplen ciertas condiciones. Estas condiciones son que el token es una instancia del token correcto, está autenticado y el nombre de usuario coincide con el del usuario que inició sesión.

En segundo lugar, este código tuvo que modificarse para verificar la autenticación en función del usuario original si intentaba cambiar de usuario. This issue detalla un problema similar que alguien más tuvo. La solución consistía en recorrer los roles para encontrar un SwitchUserRole y usar esos datos para autenticarse. He copiado el siguiente parche, que iría después de la declaración inicial if anterior.

foreach ($token->getRoles() as $role) { 
    if ($role instanceof SwitchUserRole) { 
     $token = $role->getSource(); 
      break; 
    } 
} 

Juntos, el oyente autenticación sólo creará un nuevo token si no pasa a ciertas condiciones y un usuario que está presente como otra tienen sus credenciales de autenticación utilizado para las pruebas en lugar de la del usuario que están tratando de hacerse pasar

Cuestiones relacionadas