Un user capable de se connecter sois avec le name ou email

Bonjour,

Voila je rencontre un petit problème avec mon code.
Je suis débutant et je suis le tp2 de Grafikart dans la formation Laravel. Mais celle-ci
utilise Laravel 5 et moi Laravel 5.2, c'est la que le probleme s'oppose.
Le system d auth est different de ce lui dans la video et je suis perdu

12 réponses


Je pense que tu es obligé de modifier la fonction login dans ton LoginController.

protected $username = "email";

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

        $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 ($lockedOut = $this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        $credentials = $this->credentials($request);

        if ($this->guard()->attempt($credentials, $request->has('remember'))) {
            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.
        if (! $lockedOut) {
            $this->incrementLoginAttempts($request);
        }

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

Il faudrait essayer ça parce que je ne peux pas tester là. L'input où tu dois rentrer l'username ou l'email s'appelle login dans mon cas. Il s'agit des deux premières lignes de la fonction.

Salut !

Alors je te conseil de lire la documentation sur l'authentification sur laravel 5.2 ou alors de fouiller un peu dans les classes d'Auth (Plus précisément la classe AuthenticateUsers.
Une option te permet de définir quel champ prendre en compte.

Il suffit de rajouter dans le fichier Auth\AuthController, une propriété :

protected $username = 'username';

On peut voir dans le fichier AuthenticateUsers, dans la fonction loginUsername() ceci :

return property_exists($this, 'username') ? $this->username : 'email';

Donc il regarde si tu as une propriété de ta classe nommé username, si oui, alors il prendra la valeur comme colonne, sinon il prend l'email.

Tu ne peux pas faire ça...
Comme il souhaite la possibilité de se loguer soit avec l'email soit avec l'username. Tu es obligé de faire un test dans la fonction login s'il s'agit d'un email. Si ce n'est pas un email, tu set la propriété à $this->username = "username";

$this->username = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
$request->merge([$this->username => $request->input('login')]);

Cependant, je n'avais pas expliqué d'où venait protected $username = "email".

Pourquoi toujours vouloir modifier la fonction login et pas simplement modifier la fonction loginUsername ?

faire return filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
mais si tu appeles ton champ login, faut bien lui dire quelque part ça : $request->merge(["lechampchoisi" => $request->input('login')]);
Du coup tu le mets où ça ? Aussi dans loginUsername ?

My bad, j'avais pas pensé à ca

Alors tu peux faire :

protected function getCredentials(Request $request)
{
$array = $request->only('password');

if(filter_var($request->input('login'), FILTER_VALIDATE_EMAIL)) $array['email'] = $request->input('login');
else $array['username'] = $request->input('login')

return $array;
}

Et même pas besoin de toucher à loginUsername, tu mets juste :

protected $username = 'login';

Après j'ai pas testé mais ça devrait être bon

Je préfère éviter de toucher aux grosses fonctions quand il suffit de modifier les plus petites, après oui, si ça ne fonctionne pas, il faudra toucher à la fonction postLogin

La fonction est juste credentials mais j'ai compris le principe et je pense que ça fonctionne.
D'ailleurs pourquoi tu es contre la modification de la fonction login ?

Ah c'est possible que ce soit juste credentials j'étais dans un laravel 5.1 quand j'ai bricolé ça, je le modifie merci de l'avoir fait remarquer

Parce que la fonction login est beaucoup plus grosse et contient beaucoup plus de logique, donc si laravel a séparé son code pour séparer la logique et le rendre plus simple, alors autant l'utiliser ^^

Edit : je viens de vérifier dans un autre projet qui utilise laravel 5.2 j'ai getCredentials aussi :o

protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'password');
    }

C'est bien cette fonction non ?
Je suis à la version 5.2.41
Autant cela parait possible qu'ils aient changé le nom de la fonction de la 5.1 à 5.2 par contre un changement durant la 5.2 parait étonnant.

Et merci de l'explication. ;)

EDIT : d'ailleurs on a parlé de loginUsername mais dans ma version, la fonction s'appelle simplement username

Weird, je suis une version avant toi : 5.2.40 et j'ai ça :

protected function getCredentials(Request $request)
    {
        return $request->only($this->loginUsername(), 'password');
    }

Pas de problème, en programmation il vaut toujours mieux essayer de séparer le code qu'on a (sans abuser) afin qu'il soit plus facile à comprendre, parce que si tu reviens sur ton code dans trois mois, tu auras plus facile à comprendre ce qu'un appel à getCredentials/credentials fait comparé à avoir le code directement dans la fonction postLogin (si tu vois ce que je veux dire)

Ahahah, oublie ce que j'ai dit. Il s'agit de la 5.3 les fonctions que je t'ai donné. Desolé de la confusion, j'ai regardé sur mon projet test.

Ah d'acc, pas de prob ;)