gpt4 book ai didi

symfony2 通过用户名或电子邮件登录

转载 作者:行者123 更新时间:2023-12-03 00:24:24 25 4
gpt4 key购买 nike

我正在使用 Symfony2 的标准身份验证机制,我想让用户使用他的用户名或电子邮件登录,但我不知道为什么它不起作用。我已经测试了存储库类,它按预期工作。我已经关注了这个how-to .

这是我的用户提供程序类:

<?php

namespace My\UserBundle\Entity;

use Doctrine\ORM\EntityRepository ,
Symfony\Component\Security\Core\User\UserProviderInterface ,
Symfony\Component\Security\Core\User\UserInterface;

/**
* UserRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class UserRepository extends EntityRepository implements UserProviderInterface
{
function loadUserByUsername($username)
{

$qb = $this->createQueryBuilder('u') ;
return
$qb->select('u')
->where(
$qb->expr()->orx(
$qb->expr()->like('u.username' ,':username') ,
$qb->expr()->like('u.email' ,':username')
)
)
//->andWhere($qb->expr()->eq('u.enabled' ,'true') )
->setParameters(array('username' =>$username ) )
->getQuery()
->getResult() ;
}

function refreshUser(UserInterface $user)
{
return $this->loadUserByUsername($user->getUsername() );
}

function supportsClass($class)
{
return $class === 'My\UserBundle\Entity\User';
}

}

最佳答案

我提出了一种更简单的方法,只需要编辑 security.yml 文件。

您必须创建两个不同的安全提供程序,但都使用相同的 User 类。第一个将用户名作为属性,第二个将电子邮件作为属性。

然后您创建一个包含两个提供商的chain_provider,并在防火墙部分使用它

security:

providers:
chain_provider:
chain:
providers: [db_username, db_email]
db_username:
entity:
class: MyUserBundle:User
property: username
db_email:
entity:
class: MyUserBundle:User
property: email

firewalls:

default:
anonymous: ~
provider: chain_provider
form_login:
login_path: /login
check_path: /login

我不知道这种方法是否是一种干净的做法,但是快速、简单并且效果很好。

关于symfony2 通过用户名或电子邮件登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8325939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com