2016-02-02 2 views
5

Я искал, чтобы создать поставщика услуг для входа в систему с электронной почтой, а не с именем пользователя FOSUserBundle.FOSUserBundle логин с электронной почтой с поставщиком услуг, лучшая практика

Сначала я написал это в моем security.yml файл по документу here:

security: 
    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

Согласно FOS док, я следую за эти steps один за другим.

За исключением MyUserManager.php я написал это (в соответствии с другим вопросом о стеке here):

namespace Frontend\UserBundle\Model; 

use FOS\UserBundle\Entity\UserManager; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 

class CustomUserManager extends UserManager 
{ 
    public function loadUserByUsername($email) 
    { 
     /*$user = $this->findUserByUsernameOrEmail($username); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $username)); 
     } 

     return $user;*/ 

     //Change it to only email (Default calls loadUserByUsername -> we send it to our own loadUserByEmail) 
     return $this->loadUserByEmail($email); 
    } 

    public function loadUserByEmail($email) 
    { 
     $user = $this->findUserByEmail($email); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('No user with email "%s" was found.', $email)); 
     } 

     return $user; 

    } 
} 

и, конечно, я изменил класс пользователя для того, чтобы реализовать конкретные геттер и сеттер, как это:

namespace Acme\UserBundle\Entity; 

use FOS\UserBundle\Entity\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity(repositoryClass="Acme\UserBundle\Entity\UserRepository") 
* @ORM\Table(name="users") 
*/ 
class User extends BaseUser 
{ 

    // ... 

    // override methods for username and tie them with email field 

    /** 
    * Sets the email. 
    * 
    * @param string $email 
    * @return User 
    */ 
    public function setEmail($email) 
    { 
     $this->setUsername($email); 

     return parent::setEmail($email); 
    } 

    /** 
    * Set the canonical email. 
    * 
    * @param string $emailCanonical 
    * @return User 
    */ 
    public function setEmailCanonical($emailCanonical) 
    { 
     $this->setUsernameCanonical($emailCanonical); 

     return parent::setEmailCanonical($emailCanonical); 
    } 

    // ... 

} 

Но я owerride форму шаблона FOSUser в app\Resources\FOSUserBundle\views\Security\login.html.twig так:

{% block fos_user_content %} 
    <form action="{{ path("fos_user_security_check") }}" method="post"> 

    <input type="hidden" name="_csrf_token" value="{{ csrf_token }}"/> 

    <label class="" for="username">E-mail</label> 
    <input type="email" class="" id="username" name="_username" required="required"/> 

    <label class="" for="password">{{ 'security.login.password'|trans }}</label> 
    <input class="" type="password" id="password" name="_password" required="required"/> 

    <label class="" for="remember_me"> 
     <input type="checkbox" id="remember_me" name="_remember_me" class=""> 
     <span class="">{{ 'security.login.remember_me'|trans }}</span> 
    </label> 

    <button class="" type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans }}"> 
     LogIn 
    </button> 
    </form> 
{% endblock fos_user_content %} 

Это хороший способ разрешить пользователю Вход с поля электронной почты и не имя пользователя?

+2

Да, вы можете использовать, как это. Я работаю так, и все в порядке. –

+0

@ MertÖKSÜZ благодарим за ответ, если это хорошо, я надеюсь, что это может помочь другим любителям симфонии! –

+0

Надеюсь тоже :) спасибо. –

ответ

4

Ваш подход полностью восстанавливает все обязательные изменения для настройки аутентификации по электронной почте на FOSUserBundle.

В настоящее время я использовал только ту же конфигурацию в конфигурации сущности и безопасности (не нужен шаблон, потому что мой логин выполнен в AJAX). Единственное сомнение у меня есть следующие:

Как username всегда устанавливается с помощью значения email поля, является полезным для создания CustomUserManager?
Имя loadByUsername будет работать, если имя пользователя всегда равно электронной почте, как это делает ваша организация в setEmail и setEmailCanonical.

Это просто дополнительная безопасность?

EDIT

Переход от пользователя к электронному банку предполагает изменить некоторые поведение в формостроительстве/проверки.

Может быть, вы должны смотреть на этот ответ: https://stackoverflow.com/a/21064627/4363634

+1

как я мог прочитать в документе Symfony процесс аутентификации зависит от «провайдеров пользователей». Когда пользователь отправляет электронное письмо и пароль, уровень аутентификации запрашивает у настроенного провайдера пользователя возврат объекта пользователя для данного аргумента (здесь электронная почта). Поэтому я поддерживаю UserManger, чтобы оставаться в форме с документом. Я просто следую за доктором, чтобы быть уверенным, что это лучшая практика. Надеюсь, вы понимаете, что я хотел бы сделать, и это могло бы помочь вам, если вам это нужно. –

+1

Хорошо, теперь для меня это ясно, мне нужно многому научиться и прочитать документацию о том, как безопасность обрабатывается в Symfony. Я буду искать об этом и, конечно же, применять вашу логику для обеспечения максимальной эффективности. Спасибо за ваш ответ. – chalasr

+0

добро пожаловать. Я размещаю этот вопрос здесь, чтобы быть уверенным, что я создал правильную практику/метод и имею некоторые другие предложения разработчиков, если это не так. Я счастлив, если это поможет вам. –

Смежные вопросы