Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Confección de controlador y security.yml para un custom provider

26 de octubre de 2015

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

#1

Ya has hecho lo más difícil. Lo único que te queda es lo que se explica en este artículo:

  1. Crear un servicio para el "user provider" propio.
  2. Modificar el security.yml para añadir este nuevo "provider" mediante el servicio creado anteriormente.

@javiereguiluz

27 octubre 2015, 10:59
#2

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

27 octubre 2015, 12:40
#3

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

27 octubre 2015, 12:54
#4

Otra consulta: dónde puedo encontrar todos los argumentos y sus opciones.

Gracias.

@dariongg

27 octubre 2015, 13:35
#5

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

27 octubre 2015, 14:54