2017-06-05 1 views
0

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?

+0

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

+0

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. –

Répondre

2

Vous pouvez le faire dans votre fonction de connexion de votre contrôleur (normalement le LoginController)

Vous obtenez d'abord à l'utilisateur un e-mail unique. Ensuite, vous vérifiez si le compte a la variable. Si oui, vous pouvez essayer de vous connecter à l'utilisateur, sinon vous pouvez lancer une erreur.

class LoginController extends Controller 
{ 

    use AuthenticatesUsers; 

     public function login(Request $request) { 
     $this->validateLogin($request); 

     // If the class is using the ThrottlesLogins trait, we can automatically throttle 
     // the login attempts for this application. We'll key this by the username and 
     // the IP address of the client making these requests into this application. 
     if ($this->hasTooManyLoginAttempts($request)) { 
      $this->fireLockoutEvent($request); 

      return $this->sendLockoutResponse($request); 
     } 
     $user = App\User::where('email', $request->get('email'))->first(); 

     if ($user && $user->status_id == 1 && $this->attemptLogin($request)) { 
      return $this->sendLoginResponse($request); 
     } 

     // If the login attempt was unsuccessful we will increment the number of attempts 
     // to login and redirect the user back to the login form. Of course, when this 
     // user surpasses their maximum number of attempts they will get locked out. 
     $this->incrementLoginAttempts($request); 

     return $this->sendFailedLoginResponse($request); 
    } 
} 
+0

Ceci est la réponse correcte, mais a besoin d'améliorations et de corriger les erreurs de syntaxe. J'ai essayé d'éditer mais il indique que la queue d'édition est pleine. Peut-être que quelqu'un en a besoin aussi alors pourriez-vous ajouter ces lignes; 'utiliser AuthenticatesUsers { se connecter en tant que traitLogin protégé; } 'et utilisez' return $ this-> traitLogin ($ request); 'au lieu de' Auth :: try ($ request-> only (['email', 'password'])); ' Enfin merci. –

+0

Mis à jour ma réponse. J'ai utilisé maintenant la fonction de connexion du trait et une instruction if modifiée. vous pouvez changer la logique, par exemple si vous voulez afficher un autre message lorsque l'utilisateur n'est pas activé, mais cela devrait fonctionner maintenant. – mimo

+0

J'ai déjà édité une ancienne version de votre code pour mon projet et cela fonctionne aussi. Aussi, je remplace la méthode AuthenticatesUsers :: sendFailedLoginResponse dans LoginController afin que je puisse envoyer n'importe quel message pour n'importe quelle situation. Il n'y a aucun changement dans AuthenticatesUsers ou SessionGuard. Merci encore. –