Anmeldung mit Benutzername oder E-Mail in Laravel 5.4 zulassen

Lesezeit: 5 Minuten

Benutzer-Avatar
Paul Lucaro

Jetzt habe ich die Laravel-Dokumentation zum Zulassen von Benutzernamen während der Authentifizierung befolgt, aber es nimmt die Möglichkeit, die E-Mail zu verwenden. Ich möchte Benutzern erlauben, sich mit ihrem Benutzernamen oder ihrer E-Mail-Adresse anzumelden. Wie gehe ich vor?

Ich habe diesen Code gemäß der Laravel-Dokumentation zum LoginController hinzugefügt und erlaubt nur den Benutzernamen für die Anmeldung. Ich möchte, dass es den Benutzernamen oder die E-Mail-Adresse für die Anmeldung akzeptiert.

public function username () {
    return 'username';
}

  • Verwenden Sie die Standardauthentifizierung von Laravel? Wenn ja, müssen Sie entweder Benutzername oder E-Mail auswählen. nicht beide. usrname gibt einen String zurück, kein Array. Wenn Sie eine benutzerdefinierte Anmeldung wünschen, müssen Sie die Logik selbst schreiben.

    – EddyTheDove

    10. März 2017 um 3:00 Uhr

  • wie mache ich das? Ich bin mir nicht sicher, welche Dateien ich bearbeiten soll, wenn ich meine eigene Logik schreiben möchte.

    – Paul Lucaro

    10. März 2017 um 3:03 Uhr

  • Überprüfen Sie meine Antwort unten.

    – EddyTheDove

    10. März 2017 um 3:35 Uhr

Ich denke, eine einfachere Möglichkeit besteht darin, einfach die Benutzernamenmethode in LoginController zu überschreiben:

public function username()
{
   $login = request()->input('login');
   $field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
   request()->merge([$field => $login]);
   return $field;
}

  • Das Beste am Code (und auch das Schlimmste, weil er der Grund für das Imposter-Syndrom ist) ist, dass es immer einen einfacheren Weg gibt. Schöne Lösung 🙂

    – Gewähren

    25. Mai 2018 um 0:00 Uhr

Befolgen Sie die Anweisungen von diesem Link: https://laravel.com/docs/5.4/authentication#authenticating-users

Dann können Sie die Benutzereingabe wie folgt überprüfen

$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'
]);

Dies ist nur ein Beispiel. Es gibt unzählige verschiedene Ansätze, die Sie ergreifen können, um dasselbe zu erreichen.

Benutzer-Avatar
Rakibul-Islam

Öffne dein LoginController.php Datei.

  1. Fügen Sie diese Referenz hinzu

    use Illuminate\Http\Request;
    
  2. Und überschreibe die Credentials-Methode

    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,
        ];
    }
    

Erfolgreich getestet im Laravel 5.7.11

  • Interessanterweise empfiehlt die Laravel 5.8-Dokumentation die Funktion username(), aber das hat bei mir nicht funktioniert. Aber dieser crententials()-Ansatz tut es.

    – Kerbin

    17. April 2019 um 20:20 Uhr

Sie müssen überschreiben protected function attemptLogin(Request $request) Methode aus \Illuminate\Foundation\Auth\AuthenticatesUsers Trait in Ihrem LoginController, dh in meiner LoginController-Klasse

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
    ]);
}

Ihre LoginController-Klasse sollte Trait verwenden \Illuminate\Foundation\Auth\AuthenticatesUsers um zu überschreiben attemptLogin Methode dh

class LoginController extends Controller {

     use \Illuminate\Foundation\Auth\AuthenticatesUsers;
     .......
     .......
}

Benutzer-Avatar
Jagadesha NH

Ich denke, es ist noch einfacher, einfach die Methode von zu überschreiben AuthentifiziertBenutzer Traits, Credentials-Methode in Ihrem LoginController. Hier habe ich implementiert, dass Sie sich entweder mit E-Mail oder Telefon anmelden können. Sie können es an Ihre Bedürfnisse anpassen.

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

  • Dies funktioniert gut, auch wenn Sie es in LoginController implementieren, was eine subtilere und sicherere Methode ist.

    – KiritoLyn

    17. Mai 2019 um 2:45 Uhr

  • Gut gemacht, nach einem Laravel-Upgrade ist dies ein sicherer Weg für die Implementierung

    – KiritoLyn

    17. Mai 2019 um 6:14 Uhr

So mache ich es:

// 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
    }
 }       

Ich glaube, es gibt einen kürzeren Weg, aber für mich funktioniert das und ist leicht zu verstehen.

  • Dies funktioniert gut, auch wenn Sie es in LoginController implementieren, was eine subtilere und sicherere Methode ist.

    – KiritoLyn

    17. Mai 2019 um 2:45 Uhr

  • Gut gemacht, nach einem Laravel-Upgrade ist dies ein sicherer Weg für die Implementierung

    – KiritoLyn

    17. Mai 2019 um 6:14 Uhr

Benutzer-Avatar
Mahedi Hasan Durjoy

Fügen Sie diesen Code Ihrem Login-Controller hinzu – Hoffentlich funktioniert es. Bezug Login mit E-Mail oder Benutzername in einem Feld

 public function __construct()
{
    $this->middleware('guest')->except('logout');

    $this->username = $this->findUsername();
}

public function findUsername()
{
    $login = request()->input('login');

    $fieldType = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';

    request()->merge([$fieldType => $login]);

    return $fieldType;
}

public function username()
{
    return $this->username;
}

1051870cookie-checkAnmeldung mit Benutzername oder E-Mail in Laravel 5.4 zulassen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy