1) Crea una clase que uses como servicio para proveer usuarios. Sería un "custom user provider". Esa clase debe implementar una interface especifica de Symfony. use Doctrine\DBAL\Connection;
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;
class MyUserProvider implements UserProviderInterface
{
// inyectas la conexión de doctrine DBAL
public function __construct(Connection $db)
{
$this->db = $db;
}
// Estos metodos son los que debes implementar de la interface
public function loadUserByUsername($username)
{
// buscar al usuario
$usuario = $this->db->fetchAssoc('select * from usuarios where username = ?', [$username]);
if ($usuario) { return new Usuario($usuario['username'], $usuario['password'], $usuario['salt'], $usuario['roles']);
}
throw new UsernameNotFoundException(sprintf('Usuario %s no encontrado', $username));
}
public function refreshUser(UserInterface $user)
{
if (!$user instanceof Usuario) {
throw new UnsupportedUserException(
sprintf('Instances of "%s" are not supported.', get_class($user))
);
}
return $this->loadUserByUsername($user->getUsername());
}
public function supportsClass($class)
{
return $class === get_class($this);
}
}
2) DEBES crear una clase Usuario que contenga los datos... bueno, del usuario que acabas de encontrar.
3) Debes registrar el servicio MyUserProvider en services.ym en tu bundle.
services:
my_user_provider:
class: BlaBundle\Bla\User\MyUserProvider; // Nombre completo de la clase
arguments: [@doctrine.dbal.default_connection]
4) Luego registras ese provider en la configuración de seguridad
security:
providers:
myprovider:
id: my_user_provider
encoders:
BlaBundle\Bla\User\Usuario: sha512 // debes indicar como se "hashearan" los passwords
5) Listo.
Saludos.