Вход в 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;

    ....
    ....

  }
Другие вопросы по тегам