【发布时间】: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
如果我更改实体以抽象我的应用程序不起作用。
- 我可以在不抽象实体类的情况下实施任何建议。
参考
【问题讨论】:
-
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