Saludos
Tengo problemas para implementar mi login de acceso. Como se explica en esta consulta: Sesión de usuario personalizada.
Quiero generar un acceso a una aplicacion web (symfony 2.7) a través de tarjeta Hid de proximidad. En la práctica el lector funciona como un teclado, es decir, cuadno pasa la tarjeta lee su codigo y lo escribe.
Por tarnto debo crear un provider que busque el ID de la tarjeta en una de las 3 bd que se van a usar para la aplicación. este es provider.
1.- Mi duda si está bien definida la conexión Doctrine.
namespace AppBundle\Security\User; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; use AppBundle\Security\User\PrUser; class PrUserProvider implements UserProviderInterface { protected $doctrine; public function __construct($doctrine) { $this->doctrine = $doctrine; } public function loadUserByUsername($username) { $emt = $this->doctrine->getEntityManager('externo'); // $username = codigo de la tarjeta $userData = $emt->getRepository('CardBundle:Tarjeta')->findOneByXAtrtarjeta($username); if ($userData) { return new PayrollUser($username, $name); } throw new UsernameNotFoundException( sprintf('No hay registro de la tarjeta, por favor, consultar en Oficinas de Capital Humano.') ); } public function refreshUser(UserInterface $user) { if (!$user instanceof PrUser) { throw new UnsupportedUserException( sprintf('La instancia no es soportada.', get_class($user)) ); } return $this->loadUserByUsername($user->getUsername()); } public function supportsClass($class) { return $class === 'AppBundle\Security\User\PrUser'; } }
Además implementé UserInterface
namespace AppBundle\Security\User; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\EquatableInterface; class PrUser implements UserInterface, EquatableInterface { private $username; private $password; private $salt; private $roles; private $name; public function __construct($username, $name) { $this->username = $username; $this->password = NULL; $this->salt = NULL; $this->roles = array('ROLE_USER'); $this->name = $name; } public function getRoles() { return $this->roles; } public function getPassword() { return $this->password; } public function getSalt() { return $this->salt; } public function getUsername() { return $this->username; } public function getName() { return $this->name; } public function eraseCredentials() { } public function isEqualTo(UserInterface $user) { if (!$user instanceof PayrollUser) { return false; } return true; } }
Mi duda es cómo definir correctamente security.yml y controlador relacionado.
Seguí este punto de la documentación de symfony
No me resulta.
Me podrían orientar.
Gracias.
Respuestas
Ya has hecho lo más difícil. Lo único que te queda es lo que se explica en este artículo:
- Crear un servicio para el "user provider" propio.
- Modificar el
security.yml
para añadir este nuevo "provider" mediante el servicio creado anteriormente.
@javiereguiluz
Gracias.
Está bien definido doctrine para su uso en el provider.
services: payroll_user_provider: class: AppBundle\Security\User\PayrollUserProvider arguments: [@doctrine]
Y aquí
class PrUserProvider implements UserProviderInterface { protected $doctrine; public function __construct($doctrine) { $this->doctrine = $doctrine; } // ... $em = $this->doctrine->getEntityManager('bd1');
@dariongg
En tu caso sería más cómo inyectar directamente el entity manager:
services: payroll_user_provider: class: AppBundle\Security\User\PayrollUserProvider arguments: ["@doctrine.orm.entity_manager"]
@javiereguiluz
Otra consulta: dónde puedo encontrar todos los argumentos y sus opciones.
Gracias.
@dariongg
Puedes ver todos los servicios disponibles ejecutando este comando:
$ php app/console debug:container
Si le pasas el nombre de un servicio, ves sus detalles:
$ php app/console debug:container doctrine.orm.default_entity_manager [container] Information for service doctrine.orm.default_entity_manager Service Id doctrine.orm.default_entity_manager Class Doctrine\ORM\EntityManager Tags - Scope container Public yes Synthetic no Lazy no Synchronized no Abstract no Factory Class Doctrine\ORM\EntityManager Factory Method create
@javiereguiluz