【问题标题】:How to make Username Email case Insensitive in Symfony如何在 Symfony 中使用户名电子邮件不区分大小写
【发布时间】:2020-09-15 18:35:49
【问题描述】:

我需要什么

  • 用户名:存储在数据库中的 ABC@gmail.com 电子邮件地址,输入将是小写。

  • 没有存储小写电子邮件地址的规范字段。

解决办法

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

我看了网址https://symfony.com/doc/current/security/user_provider.html

security.yml

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

属性:用户名

我已经注释掉了属性,因为我需要在存储库中调用 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

修复了使实体抽象导致问题的错误之后。

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

如果我更改实体以抽象我的应用程序不起作用。

  • 我可以在不抽象实体类的情况下实施任何建议。

参考

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

How to do username case insensitive in login form?

【问题讨论】:

  • Oracle db 12c 中的 oracle sir 问题
  • custom user provider 的配置略有不同。您基本上需要明确提供服务 ID。如果实体正确映射到用户存储库,并且您定义了一个使用存储库类名称作为服务 ID 的服务,那么您仅使用实体的示例就可以工作。
  • 而且你的服务文件搞砸了。您应该定义一个 UserRepository 服务,而不是一个通用的 Doctrine 实体存储库服务。你用的是什么 Symfony 版本? Autowire 实际上可以让您的生活更轻松。
  • 如果你使用像->setParameter('query', strtolower($username)) 这样的东西,你必须小心。 strtolower 不是 Unicode 安全的。您可以为此使用新的 Symfony String 组件:u($username)->lower();
  • 正如我之前的评论中提到的,您的 UserRepository 没有正确映射到您的 User 实体。

标签: php oracle symfony doctrine-orm


【解决方案1】:

您可以使用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;
    }
    

【讨论】:

  • 前端 Angular 9 后端 Symfony 4.4 作为 API 登录:/login_check
  • 请帮助完成 symfony 用于 login_check 的完整查询 loadUserByUsername
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2018-04-28
  • 2012-04-06
  • 2020-11-09
相关资源
最近更新 更多