Laravel France

Problème d'auhtentification avec table "User" différente (Laravel 7)

Avatar de Hugo
Hugo

Bonjour,

Je suis nouveau sur le Forum (c'est mon premier poste), je sais pas si je suis dans la bonne catégorie car mon application est en version7...

Je vous explique mon problème :

J'ai un soucis au niveau de mon authentification. Mon but étant de me connecter avec un "fr" et un "mdp" mais, lorsque je rentre mes identifiants pour me connecter rien ne se passe... (aucune erreur et je ne suis pas connecté dans mon application).

**Voici mon projet : **

Ma table users :

Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('nom');
            $table->string('fr')->unique();
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('mdp');
            $table->enum('statut', ['user','admin']);
            $table->rememberToken();
            $table->timestamps();
        });

Mon formulaire de connexion :

<form method="POST" action"{{route('login')}}" class="user">
                      @csrf
                      <div class="form-group">
                        <input type="text" class="form-control form-control-user {{ $errors->has('username') ? ' is-invalid' : '' }}" id="username" name="username" placeholder="Entrer votre FR :">
                        @if ($errors->has('username'))
                          <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('username') }}</strong>
                          </span>
                        @endif
                      </div>
                      <div class="form-group">
                        <input type="password" class="form-control form-control-user {{ $errors->has('mdp') ? ' is-invalid' : '' }}" id="mdp" name="mdp" placeholder="Entrer votre mot de passe :">
                        @if ($errors->has('mdp'))
                          <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('mdp') }}</strong>
                          </span>
                        @endif
                      </div>
                    <div class="form-group">
                    <button type="submit" class="btn btn-warning btn-lg" value="Login">Se connecter</button>
                    </div>
                  </form>

Mon fichier de routage :

Auth::routes(['register'=>false]);

Route::get('/', function () {
    return view('template');
});

Mon AuthenticatesUser :

    protected function validateLogin(Request $request)
    {
      dd($request->all());
        $request->validate([
            $this->username() => 'required|string',
            'mdp' => 'required|string',
        ]);
    }
    
        public function username()
    {
        return 'fr';
    }

J'ai tester "dd($request->all());" dans ma fonction "login" ce qui me retourne bien quelque chose dans chaque champs mais la connexion ne se fait pas ...

ça fait déjà un long moment que je galère, merci pour le futur coup de main

Posté il y a 3 mois
Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Avait-tu essayé de ton connecter avec le couple normal email/mdp avant ta surcharge ?

Je vois que dans Laravel 7 les fichiers sont completement differents des version précédentes (pas d'AuthenticatesUsers.php) https://github.com/laravel/framework/tree/6.x/src/Illuminate/Foundation/Auth VS https://github.com/laravel/framework/tree/7.x/src/Illuminate/Foundation/Auth Je ne suis pas encore passé au 7 (je traîne encore une version 5 upgradée en 6) donc je ne sais pas si c'est lié

Posté il y a 3 mois
Avatar de Hugo
Hugo

J'ai pas testé avec le couple normal avant de faire ma surcharge mais je penses que ça ne devrais pas poser de problème. En version 7 l'AuthenticatesUsers.php se trouve ici : vendor\laravel\ui\auth-backend\AuthenticatesUsers.php

J'ai continué de mon coté en modifiant mon formulaire + ma fonction validateLogin et j'ai maintenant une erreur sur mon champ fr : " These credentials do not match our records." si ça parle a quelqu'un ?

Voici mes modifications :

**Formulaire : **

<form method="POST" action"{{route('login')}}" class="user">
                      @csrf
                      <div class="form-group">
                        <input type="text" class="form-control form-control-user {{ $errors->has('fr') ? ' is-invalid' : '' }}" id="fr" name="fr" placeholder="Entrer votre FR :">
                        @if ($errors->has('fr'))
                          <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('fr') }}</strong>
                          </span>
                        @endif
                      </div>
                      <div class="form-group">
                        <input type="password" class="form-control form-control-user {{ $errors->has('mdp') ? ' is-invalid' : '' }}" id="mdp" name="mdp" placeholder="Entrer votre mot de passe :">
                        @if ($errors->has('mdp'))
                          <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('mdp') }}</strong>
                          </span>
                        @endif
                      </div>
                    <div class="form-group">
                    <button type="submit" class="btn btn-warning btn-lg" value="Login">Se connecter</button>
                    </div>
                  </form>

**validateLogin(Request $request) : **

protected function validateLogin(Request $request)
    {
        $request->validate([
            'fr' => 'required|string',
            'mdp' => 'required|string',
        ]);
    }
Posté il y a 3 mois
Avatar de tanguy
tanguy

Salut,

J'ai deux questions pour toi, as-tu un controlleur pour gerer cette connexion si oui peux-tu la mettre aussi dans le post ? Et l'autre pourquoi ne pas utiliser la gestion d'authentifaction de laravel directement ?

Dernier chose pour t'aider a trouvé les bug plus vite tu devrais installer "barryvdh/laravel-debugbar" c'est tres utile.

Posté il y a 3 mois
Avatar de Hugo
Hugo

Bonjour Tanguy,

J'ai installé la debugbar (c'est top!).

J'utilise la gestion d'authentification de Laravel mais j'ai eu besoin de modifier quelque champs dans la table "Users", en particulier mon champs "fr" qui remplace le champe "username" de Laravel.

Concernant mon controller le voici :

-LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/';

    /**
 * Login username to be used by the controller.
 *
 * @var string
 */
protected $fr;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
        $this->username = 'fr';
    }

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

}

Il fait appel au trait "AuthenticatesUsers" qui ressemble à ça :

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;

trait AuthenticatesUsers
{
    use RedirectsUsers, ThrottlesLogins;

    /**
     * Show the application's login form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLoginForm()
    {
        return view('auth.login');
    }

    /**
     * Handle a login request to the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    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);
        }

        if ($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);
    }

    /**
     * Validate the user login request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function validateLogin(Request $request)
    {
        $request->validate([
            $this->username() => 'required|string',
            'password' => 'required|string',
        ]);
    }

    /**
     * Attempt to log the user into the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return bool
     */
    protected function attemptLogin(Request $request)
    {
        return $this->guard()->attempt(
            $this->credentials($request), $request->filled('remember')
        );
    }

    /**
     * Get the needed authorization credentials from the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'password');
    }

    /**
     * Send the response after the user was authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    protected function sendLoginResponse(Request $request)
    {
        $request->session()->regenerate();

        $this->clearLoginAttempts($request);

        return $this->authenticated($request, $this->guard()->user())
                ?: redirect()->intended($this->redirectPath());
    }

    /**
     * The user has been authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  mixed  $user
     * @return mixed
     */
    protected function authenticated(Request $request, $user)
    {
        //
    }

    /**
     * Get the failed login response instance.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function sendFailedLoginResponse(Request $request)
    {
        throw ValidationException::withMessages([
            $this->username() => [trans('auth.failed')],
        ]);
    }

    /**
     * Get the login username to be used by the controller.
     *
     * @return string
     */
    public function username()
    {
        return 'fr';
    }

    /**
     * Log the user out of the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function logout(Request $request)
    {
        $this->guard()->logout();

        $request->session()->invalidate();

        return $this->loggedOut($request) ?: redirect('/');
    }

    /**
     * The user has logged out of the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return mixed
     */
    protected function loggedOut(Request $request)
    {
        //
    }

    /**
     * Get the guard to be used during authentication.
     *
     * @return \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected function guard()
    {
        return Auth::guard();
    }
}

En te remerciant

Posté il y a 3 mois
Avatar de tanguy
tanguy

Salut,

Je me demande si ton model user contient bien les champs que tu as rajouté "fr", "mdp" et "statut" , il devrait ressemblé à çà.

<?php

namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
 
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'mdp','fr','statut',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'mdp', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
    
}
Posté il y a 3 mois
Avatar de Hugo
Hugo

Oui, j'ai bien rajouté mes nouveaux champs dans mon modèle. Peut tu m'expliquer à quoi correspond la variable "fillable" ?

Sinon mon problème est résolu, je ne sais pas trop comment j'ai fais. Surement un changement dans mon nouveau formulaire mais je ne peux vous expliquer...

Posté il y a 3 mois
Avatar de CinquièmeDimension
CinquièmeDimension

La variable filable sers a indiquer à Laravel quels champs il peut recevoir pour la création. Si tu oublie un champ dans $filable, Laravel ne saura pas que ce champ existe et qu'il peut être remplis, donc ça retournera une erreur champs inconnu lors de la création d'un nouveau user. Seuls quelques champs ne sont pas obligatoires (id, createrd_at, updated_at, etc.)

Posté il y a 3 mois
Avatar de Hugo
Hugo

Encore merci pour ton explication et ton aide !

Posté il y a 3 mois

Vous ne pouvez pas répondre à ce sujet.