簡體   English   中英

FOSUserBundle使用電子郵件登錄(Symfony2)

[英]FOSUserBundle login with email (Symfony2)

我有一個關於Symfony 2.0.x的FOSUserBundle的問題。 在那里,您可以找到一種方法來更改登錄名,以使用用戶名和電子郵件。 這很棒! 但我想登錄只使用電子郵件。 所以我在CustomUserManager中添加了一個函數(從原始版本擴展而來),確保您可以使用您的電子郵件登錄。

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;

    }
}

但是現在我遇到了一個問題,我需要控制會話中保存的值。 他在會話中保存我的用戶名,當系統檢查時,將不會有可用的電子郵件(因為他只檢查電子郵件)。

所以我的問題是如何/在哪里可以更改存儲在username變量中的值。

謝謝!

這可以通過覆蓋User實體中的setter來完成:

<?php

namespace Acme\UserBundle\Entity;

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

/**
 * @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);
    }

    // ...

}

從您的問題中不清楚,但是從您的命名空間我假設您有自己的子包,它使用FOSUserBundle作為其父包(根據FOSUserBundle文檔 ,例如“b”)。

如果這樣做,您可以輕松覆蓋表單和模板,以便從UI中刪除任何username段,並將其替換為email字段。 由於您已按上述方式覆蓋了電子郵件設置器,因此將正確填充username屬性。

雖然這有效,但它不是一個非常好的解決方案。 缺點是您仍將在數據庫中擁有usernameusernameCanonical列。 我們原本想完全刪除這些,但這需要在FOSUserBundle中進行太多更改( \\FOS\\UserBundle\\Model\\UserInterface需要用戶名屬性,捆綁代碼依賴於它)。

我發現了一個非常簡單的解決方案,也許不是最好的,但簡單就是力量! ;)

我在這里寫下來,以防萬一對任何人都有好處。

我在提供商中添加了用戶名/電子郵件登錄選項:

在app / conf / security.yml中:

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

然后在您的登錄表單視圖中,我只允許使用input type =“email”登錄:

<input type="email" class="form-control" id="username" placeholder="E-Mail" name="_username" required="required"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM