2016-02-02 7 views
5

私はFOSUserBundleでユーザー名ではなく電子メールでlogInするためにサービスプロバイダを作成しようとしていました。FOSUserBundleサービスプロバイダの電子メールでログインする、ベストプラクティス

まず私は、doc hereによると、私のsecurity.ymlファイルでこれを書いた:

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

FOSドキュメントによると、私は1つによって、これらのsteps 1に従ってください。 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; 

    } 
} 

そしてもちろん、私はこのような特定のゲッターとセッターを実装するために、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); 
    } 

    // ... 

} 

しかし、私はこのようapp\Resources\FOSUserBundle\views\Security\login.html.twigでFOSUserテンプレートフォームをowerride:

{% 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を作成すると便利ですか?
あなたのエンティティがsetEmailsetEmailCanonicalで行ったように、ユーザー名が常に電子メールと等しい場合、loadByUsernameは動作します。

追加のセキュリティはありますか?ユーザ名からの電子メールの缶に

EDIT

変更は、フォーム構築/検証にいくつかの振舞にを変更することが含まれます。

たぶん、あなたはこの答えを見ている:https://stackoverflow.com/a/21064627/4363634

+1

私が読めるようにsymfonyのドキュメントでは、認証プロセスは 'ユーザプロバイダ'に依存しています。ユーザーが電子メールとパスワードを送信すると、認証レイヤーは、指定された引数(ここでは電子メール)に対してユーザーオブジェクトを返すように、構成されたユーザープロバイダーに要求します。だから、私はUserMangerを医者に任せておく。私はそれがベストプラクティスであることを確かめるために、文書に従っています。私はあなたが何をしたいのかを理解していただきたいと思います。それが必要ならば、あなたを助けることができます。 –

+1

それでは、私は今、Symfonyでセキュリティをどのように扱うかについて学び、ドキュメントを読むことが大いにあります。 これについて検索し、最大限のユースケースを確保するために、次にロジックを確実に適用します。お返事をありがとうございます。 – chalasr

+0

ようこそ。私は正しい練習/方法を作成し、他の開発者の提案がないかどうかを確かめるために、この質問をここに掲載します。これがあなたを助けることができれば幸いです。 –

関連する問題