web-dev-qa-db-fra.com

Autoriser la connexion en utilisant un nom d'utilisateur ou un e-mail dans Laravel 5.4

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';
}
19
Paul Lucero

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.

19
EddyTheDove

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;
}
50
Rabah G

Ouvrez votre LoginController.php fichier.

  1. Ajouter cette référence

    use Illuminate\Http\Request;
    
  2. 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

5
Rakibul Islam

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;
     .......
     .......
}
3
Sheharyar Naseem

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');
}
2
Jagadesha NH

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.

0
Maicon Gilton