Вход в Symfony 3 по множеству телефонов
Хорошего дня! Я хочу войти в систему своих пользователей, и это тривиальная задача. Но проблема заключается в проверке пользователя по массиву значений!
Например, у меня есть сущность пользователя и телефон. У пользователя много телефонов. Так что мне нужно войти в систему пользователя по всем телефонам, которые у него есть. Как я могу сделать это, используя инструмент безопасности по умолчанию?
Я не нашел ни одного вопроса, как мой, и прочитал всю документацию по безопасности в Symfony. Единственное, что я думал сделать, это создать собственный провайдер. Но я не думаю, что это решает мою проблему.
Любые иды, дорогие симфонеры?:)
1 ответ
Вы должны установить поставщика безопасности в security.yml
security:
# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
...
providers:
my_db_provider:
entity:
class: AppBundle:User
...
Тогда ваша сущность AppBundle:User
должен реализовать интерфейс Symfony\Component\Security\Core\User\UserInterface
и иметь собственный репозиторий для примера UserRepository
который реализует интерфейс Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface
, Ваш UserRepository
класс должен выглядеть так:
<?php
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use AppBundle\Entity\User;
use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
class UserRepository extends EntityRepository implements UserLoaderInterface
{
/**
* Loads the user for the given username.
*
* This method must return null if the user is not found.
*
* @param string $username The username
* @return null|Utilisateur
* @throws \Exception
*/
public function loadUserByUsername($username)
{
//Here you write a custom query to retrive the user base on the fields you require.
// Here I have used username, email and phone number
$q = $this
->createQueryBuilder('u')
->select('u')
->leftJoin('u.phones', 'p')
->where('u.username = :username or u.email= :email or p.phoneNumber= :phone')
->setParameter('username', $username)
->setParameter('email', $username)
->setParameter('phone ', $username)
->getQuery();
try {
$user = $q->getSingleResult();
} catch (NoResultException $e) {
throw new UsernameNotFoundException(sprintf('Unable to find an active user AppBundle:User object identified by "%s".', $username), 0, $e);
} catch (NonUniqueResultException $ex) {
throw new \Exception("The user you provided is not unique");
}
return $user;
}
}
Ваш AppByndle:User
класс сущности должен выглядеть так:
<?php
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="AppBundle\Dao\UserRepository")
*/
class User implements UserInterface
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=254, nullable=false, unique=true)
*/
private $username;
....
....
}