Как сделать регистр имени пользователя нечувствительным к регистру электронной почты в Symfony - PullRequest
0 голосов
/ 28 мая 2020

Что мне нужно

  • Имя пользователя: ABC@gmail.com адрес электронной почты, хранящийся в db, и ввод будет в нижнем регистре.

  • нет канонического поле, в котором хранится адрес электронной почты в нижнем регистре.

Решение

     select * from view   where trim(lower(username))=trim(lower(input_username))

Я прочитал Url https://symfony.com/doc/current/security/user_provider.html

security.yml

providers:
    entity_provider:
        entity:
            class: App\Entity\User

свойство: username

Я закомментировал свойство, так как мне нужно вызвать loadUserByUsername в репозитории.

Service.yml

app.repository.user_repositry:
    class: Doctrine\ORM\EntityRepository
    autowire: false

    autoconfigure: true
    factory: ["@doctrine.orm.entity_manager", getRepository]
    arguments: []
    tags: ['doctrine.repository_service']

Код репозитория

            class UserRepository extends EntityRepository implements UserLoaderInterface
            {

                public function loadUserByUsername($username)
                {

                    return $em->createQuery(
                            'SELECT u
                            FROM App\CORE\Entity\User u
                            WHERE LOWER(u.username) = :query'
                        )
                        //->where('LOWER(user.username) = :username')
                        ->setParameter('query', strtolower($username))
                        //->setParameter('query', $usernameOrEmail)
                        ->getQuery()
                        ->getOneOrNullResult();
                }
            }

Возникла проблема

  You must either make the "App\Entity\User" entity Doctrine Repository ("Doctrine\ORM\EntityRepository") implement "Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface" or set the "property" option in the corresponding entity provider configuration."

If i set Entity Abstract class then My app stops working

    namespace App\CORE\Entity;

   use Doctrine\ORM\Mapping as ORM; 
   use Symfony\Component\Security\Core\User\UserInterface;
   use Doctrine\ORM\EntityRepository;
   use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
   use Doctrine\ORM\Mapping\MappedSuperclass;

    /**
    * @ORM\Table(name="users")
   * @ORM\Entity
    */

   class User  implements UserInterface,\Serializable

После исправления ошибки, приводящей к возникновению абстрактного enity, вызывающего проблемы.

   //abstract class User extends EntityRepository implements UserLoaderInterface,UserInterface,\Serializable

если я изменяю enity чтобы абстрагироваться от моего приложения, не работающего.

  • любое предложение можно реализовать, не делая абстрактного класса сущности.

Ссылка

https://symfony.com/doc/current/security/user_provider.html

Как сделать регистр имени пользователя нечувствительным в форме входа?

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете использовать подход FOSUser с canonical username and email

  1. Добавить дополнительное поле && сохранить каноническое значение
  2. Использовать каноническое поле для поиска пользователя

    public function findUserByUsername($username)
    {
        return $this->findUserBy(['usernameCanonical' => $this->canonicalFieldsUpdater->canonicalizeUsername($username)]);
    }
    //------------
    
    public function canonicalize($string)
    {
        if (null === $string) {
            return;
        }
    
        $encoding = mb_detect_encoding($string);
        $result = $encoding
            ? mb_convert_case($string, MB_CASE_LOWER, $encoding)
            : mb_convert_case($string, MB_CASE_LOWER);
    
        return $result;
    }
    
...