Anmeldung mit Benutzername oder E-Mail in Laravel 5.4 zulassen
Lesezeit: 5 Minuten
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:
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 🙂
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.
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
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;
.......
.......
}
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.
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
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