gpt4 book ai didi

php - FOSUserBundle 使用服务提供商的电子邮件登录,最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:37:57 27 4
gpt4 key购买 nike

我想创建一个服务提供商,以便使用电子邮件登录,而不是使用 FOSUserBundle 的用户名。

首先我根据文档 here 在我的 security.yml 文件中写了这个:

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;

}
}

当然,我更改了 User 类以实现特定的 getter 和 setter,如下所示:

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 模板表单,如下所示:

{% 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 %}

It is the good way to only allow user Loged In with email field and not the username?

最佳答案

您的方法完美地恢复了在 FOSUserBundle 上设置电子邮件密码身份验证的所有强制性更改。

目前,我只在实体和安全配置中使用相同的配置(不需要模板,因为我的登录是在 AJAX 中完成的)。我唯一的疑问是:

由于 username 始终使用 email 字段值设置,创建 CustomUserManager 是否有用?
如果用户名始终等于电子邮件,loadByUsername 将起作用,正如您的实体在 setEmailsetEmailCanonical 中所做的那样。

这只是一种额外的安全措施吗?

编辑

从用户名更改为电子邮件可能涉及更改表单构建/验证中的某些行为。

也许你必须看看这个答案:https://stackoverflow.com/a/21064627/4363634

关于php - FOSUserBundle 使用服务提供商的电子邮件登录,最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35151638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com