2012-03-11 14 views
8

Estoy trabajando en un sistema de inicio de sesión relativamente simple para Symfony2.Inicio de sesión personalizado utilizando un tercer parámetro

Tengo los fundamentos abajo y funciona bien.

Lo que hace que esto sea un poco especial es que necesito una forma de proporcionar un tercer valor (un valor de ecosistema). Los nombres de usuario en mi base de datos no son únicos por sí mismos, sino que crean pares únicos con un valor de ecosistema.

El valor del ecosistema lo proporciona el formulario desde el que inician sesión.

¿Cómo puedo utilizar este valor del ecosistema para tenerlo en cuenta al realizar un inicio de sesión?

Respuesta

6

Eche un vistazo al tutorial de Cookbook en How to load Security Users from the Database (the Entity Provider) - específicamente la parte sobre Authenticating Someone with a Custom Entity Provider.

Esta parte explica cómo modificar/crear un UserProviderInterface para permitir el inicio de sesión a través de una dirección de correo electrónico o nombre de usuario. Obviamente, esto no es lo que quiere, pero debería ser relativamente trivial modificar el código para que también consulte/valide contra su tercer parámetro de inicio de sesión.

Lo ideal es que probablemente quiera crear su propio UserProvider y, afortunadamente, hay un tutorial de libros de cocina solo para eso: How to create a custom User Provider.


Actualización: tener la opción de inicio de sesión tercera manejado y se pasa a sus proveedores personalizados creados (arriba), también tendrá que crear un proveedor de autenticación personalizado. Eche un vistazo a (otro más) artículo de recetario en How to create a custom Authentication Provider. Este artículo está diseñado para manejar los parámetros del encabezado de solicitud adicional para la autenticación, pero con este ejemplo, debe poder cambiar los encabezados de solicitud para valores POST de solicitud.

Utilice el artículo del libro de cocina para comprender cómo funciona la autenticación con Symfony2, pero use (y extienda) la funcionalidad de nombre de usuario/contraseña de Symfony2 e incluya solo su 3er parámetro. Algunas clases para mirar:

+0

Ya tengo ambos implementados. Lo que no puedo entender es cómo obtener el tercer valor de mi repositorio para validarlo. – samanime

+0

@samanime: He actualizado mi respuesta, ¡espero que brinde asistencia! Si no hace nada más, eche un vistazo e imite la clase 'UsernamePasswordFormAuthenticationListener' a la que publiqué un enlace. ¡Buena suerte! – leek

+0

Bueno, eso fue mucho trabajo, pero finalmente lo conseguí. Tuve que implementar mi propio oyente de Autenticación, proveedor de autenticación, token y fábrica. Extendí la versión de UsernamePassword para la mayoría de ellos, así que no tuve que volver a implementar las medidas de seguridad que ya tenía implementadas. Tampoco pude encontrar una manera de obtener un segundo valor en un EntityRepository, así que tuve que pasar una matriz en el primer parámetro para obtener lo que necesitaba allí. no es ideal, pero funciona. – samanime

0

Se pueden crear a medida Password Authenticator (> = Symfony 2.6) y establecer atributos ahí:

  1. createToken(): Crea el token (puedes usar UsernamePasswordToken) y configura el atributo i t, toma los datos necesarios de $ solicitud.
  2. authenticateToken(): Aquí se hace algo con esta tercera variable ($ token-> getAttribute()). Si afecta loadUserByUsername lea a continuación.

En authenticateToken() tiene UserProvider y loadUserByUsername. Lo que hice fue usar my user provider (que extiende FOSUserBundle y anula dicho método) y pasarle una matriz con el nombre de usuario y los demás datos necesarios. No olvide verificar lo que se pasa dentro de loadUserByUsername (por ejemplo, si se trata de una cadena, luego llame a parent :: loadUserByUsername).

Estoy seguro de que este truco con loadUserByUsername es malo, pero no sé cómo más podría hacerlo.

Cuestiones relacionadas