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

标签 symfony email authentication

我正在使用 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/

相关文章:

android - 从 Assets 文件夹发送带有附件的电子邮件

java - Vaadin 中的 session 处理

symfony - Doctrine "A new entity was found through the relationship"错误

email - Mailgun:发送到某些域时为 '550 Requested action not taken error'

ubuntu - Symfony2 在 Ubuntu 虚拟机上运行缓慢

python - 使用 python imaplib 到 "delete"来自 Gmail 的电子邮件?

asp.net-mvc - 使用 MVC 5 进行用户身份验证,无需 EF

php - 无法在 Laravel 5.4 的 Blade 模板中使用 Auth::user()

javascript - 如何使用 Angular ng include 在 symfony 中加载 twig 文件

javascript - React - 使用和加载视频文件