Par défaut, la méthode de tentative de connexion de Laravel renvoie bool mais je souhaite la modifier et obtenir un autre résultat si l'utilisateur existe mais que le statut de l'utilisateur est passif. Je ne veux pas changer de code dans le répertoire du vendeur laravel. Je peux écrire ma propre méthode de connexion dans LoginController comme AuthenticatesUsers::login()
facilement mais le problème est SessionGuard::attempt()
a son propre cycle de vie, ce n'est pas un trait que LoginController l'utilise. Voici la version originale de SessionGuard::attempt()
.Laravel Tentative de connexion à trois états
public function attempt(array $credentials = [], $remember = false, $login = false)
{
$this->fireAttemptEvent($credentials, $remember, $login);
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
// If an implementation of UserInterface was returned, we'll ask the provider
// to validate the user against the given credentials, and if they are in
// fact valid we'll log the users into the application and return true.
if ($this->hasValidCredentials($user, $credentials)) {
if ($login) {
$this->login($user, $remember);
}
return true;
}
// If the authentication attempt fails we will fire an event so that the user
// may be notified of any suspicious attempts to access their account from
// an unrecognized user. A developer may listen to this event as needed.
if ($login) {
$this->fireFailedEvent($user, $credentials);
}
return false;
}
Note:
$credentials = [
'email' => $request->input('email'),
'password' => $request->input('password'),
'status_id' => 1
];
Mais je veux supprimer champ status_id et je veux montrer un message aux utilisateurs si le status_id de l'utilisateur n'est pas 1.
Fondamentalement, je veux juste passer outre SessionGuard::attempt()
méthode , quelque chose comme ça.
public function attempt(array $credentials = [], $remember = false, $login = false)
{
$this->fireAttemptEvent($credentials, $remember, $login);
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
// If an implementation of UserInterface was returned, we'll ask the provider
// to validate the user against the given credentials, and if they are in
// fact valid we'll log the users into the application and return true.
if ($this->hasValidCredentials($user, $credentials)) {
//User exists but user's status_id is not 1
if($user->status_id != 1)
return 2; // 2 for passive accounts
if ($login) {
$this->login($user, $remember);
}
return 1; //for active accounts
}
// If the authentication attempt fails we will fire an event so that the user
// may be notified of any suspicious attempts to access their account from
// an unrecognized user. A developer may listen to this event as needed.
if ($login) {
$this->fireFailedEvent($user, $credentials);
}
return 0; // for non exists acounts
}
Comment puis-je obtenir ceci?
Nous avons besoin de plus d'informations. Que voulez-vous dire par «tout code dans un cadre laravel»? Que devrait-il se passer dans les deux fonctions? Vous pouvez simplement connecter manuellement l'utilisateur à l'intérieur de la fonction de votre contrôleur afin de ne pas avoir à les écraser. – mimo
Désolé pour mon pauvre anglais, je suppose que je ne pouvais pas expliquer mon problème. J'ai juste édité ma question. J'espère que cette fois est meilleure que l'ancienne version. –