kos*_*dpo 5 email authentication username symfony
我正在使用Symfony2的标准身份验证机制,我想让用户使用他的用户名或电子邮件登录,但我不知道为什么它不起作用.我已经测试了存储库类,它按预期工作.我遵循了这个方法.
这是我的用户提供者类:
<?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';
}
}
Run Code Online (Sandbox Code Playgroud)
我提出了一个更简单的方法,只需要编辑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
Run Code Online (Sandbox Code Playgroud)
我不知道这种方法是否是一种干净的做法,但是快速,简单且工作正常.
好吧,伙计们,事情在我的 security.yml 中,我有这个
提供者:
主要的:
实体:{类:My\UserBundle\Entity\User,属性:用户名}
所以我必须去掉这个参数property :username
| 归档时间: |
|
| 查看次数: |
6657 次 |
| 最近记录: |