Maintenant, j'ai suivi la documentation Laravel sur la façon d'autoriser les noms d'utilisateur pendant l'authentification, mais cela enlève la possibilité d'utiliser l'e-mail. Je veux autoriser les utilisateurs à utiliser leur nom d'utilisateur ou leur e-mail pour se connecter. Comment dois-je procéder?
J'ai ajouté ce code au LoginController selon la documentation de Laravel et il n'autorise que le nom d'utilisateur pour la connexion. Je veux qu'il accepte le nom d'utilisateur ou l'e-mail pour la connexion.
public function username () {
return 'username';
}
Suivez les instructions de ce lien: https://laravel.com/docs/5.4/authentication#authenticating-users
Ensuite, vous pouvez vérifier l'entrée utilisateur comme ceci
$username = $request->username; //the input field has name='username' in form
if(filter_var($username, FILTER_VALIDATE_EMAIL)) {
//user sent their email
Auth::attempt(['email' => $username, 'password' => $password]);
} else {
//they sent their username instead
Auth::attempt(['username' => $username, 'password' => $password]);
}
//was any of those correct ?
if ( Auth::check() ) {
//send them where they are going
return redirect()->intended('dashboard');
}
//Nope, something wrong during authentication
return redirect()->back()->withErrors([
'credentials' => 'Please, check your credentials'
]);
Ce n'est qu'un échantillon. Il existe d'innombrables différentes approches que vous pouvez adopter pour accomplir la même chose.
Je pense qu'un moyen plus simple consiste à simplement remplacer la méthode du nom d'utilisateur dans LoginController:
public function username()
{
$login = request()->input('login');
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$field => $login]);
return $field;
}
Ouvrez votre LoginController.php
fichier.
Ajouter cette référence
use Illuminate\Http\Request;
Et remplacez la méthode des informations d'identification
protected function credentials(Request $request)
{
$field = filter_var($request->get($this->username()), FILTER_VALIDATE_EMAIL)
? 'email'
: 'username';
return [
$field => $request->get($this->username()),
'password' => $request->password,
];
}
Testé avec succès dans Laravel 5.7.11
Vous devez remplacer la méthode protected function attemptLogin(Request $request)
de \Illuminate\Foundation\Auth\AuthenticatesUsers
Trait dans votre LoginController, c'est-à-dire dans ma classe LoginController
protected function attemptLogin(Request $request) {
$identity = $request->get("usernameOrEmail");
$password = $request->get("password");
return \Auth::attempt([
filter_var($identity, FILTER_VALIDATE_EMAIL) ? 'email' : 'username' => $identity,
'password' => $password
]);
}
Votre classe LoginController doit utiliser Trait \Illuminate\Foundation\Auth\AuthenticatesUsers
afin de remplacer la méthode attemptLogin
c'est-à-dire.
class LoginController extends Controller {
use \Illuminate\Foundation\Auth\AuthenticatesUsers;
.......
.......
}
Je pense que c'est encore plus simple, remplacez simplement la méthode de AuthenticatesUsers traits, méthode des informations d'identification dans votre LoginController. Ici, j'ai mis en place une connexion par e-mail ou par téléphone. Vous pouvez le modifier en fonction de vos besoins.
LoginController.php
protected function credentials(Request $request)
{
if(is_numeric($request->get('email'))){
return ['phone'=>$request->get('email'),'password'=>$request->get('password')];
}
return $request->only($this->username(), 'password');
}
Voici comment je le fais:
// get value of input from form (email or username in the same input)
$email_or_username = $request->input('email_or_username');
// check if $email_or_username is an email
if(filter_var($email_or_username, FILTER_VALIDATE_EMAIL)) { // user sent his email
// check if user email exists in database
$user_email = User::where('email', '=', $request->input('email_or_username'))->first();
if ($user_email) { // email exists in database
if (Auth::attempt(['email' => $email_or_username, 'password' => $request->input('password')])) {
// success
} else {
// error password
}
} else {
// error: user not found
}
} else { // user sent his username
// check if username exists in database
$username = User::where('name', '=', $request->input('email_or_username'))->first();
if ($username) { // username exists in database
if (Auth::attempt(['name' => $email_or_username, 'password' => $request->input('password')])) {
// success
} else {
// error password
}
} else {
// error: user not found
}
}
Je pense qu'il existe un moyen plus court de le faire, mais pour moi, cela fonctionne et est facile à comprendre.