मैं ईमेल के साथ लॉग इन करने और FOSUserBundle के साथ उपयोगकर्ता नाम नहीं के लिए सेवा प्रदाता बनाने की तलाश में था।सेवा प्रदाता के साथ ईमेल के साथ 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;
}
}
और निश्चित रूप से मैं क्रम में इस तरह विशिष्ट गेटर और सेटर लागू करने के लिए उपयोगकर्ता वर्ग बदल दिया है:
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 %}
यह उपयोगकर्ता के ईमेल क्षेत्र और उपयोगकर्ता नाम से लॉग इन करने की अनुमति देने का एक अच्छा तरीका है?
हाँ, आप इस तरह उपयोग कर सकते हैं। मैं इस तरह काम कर रहा हूं और यह ठीक है। –
@ MertÖKSÜZ उत्तर के लिए धन्यवाद, अगर यह अच्छा है तो मुझे उम्मीद है कि यह अन्य सिम्फनी प्रेमियों की मदद कर सकता है! –
मुझे आशा है :) धन्यवाद। –