Laravel 5

Début Laravel authentification personnalisé

  • Avatar de Gru67
    Membre depuis :
    16/04/2019
    Messages :
    4

    Bonjour,

    Je suis actuellement en formation sur laravel, et je souhaite faire un produits assez spécifique.

    Afin de garder une cohérence dans mes tables et toutes les relations au sein de mon architecture (UML et tout le tatoin), j'ai utilisé une table Utilisateurs qui remplace ma table Users.

    Sachez que je galère aussi parce que je n'ai pas la main sur la machine et que je n'ai pas accès au composer.

    Donc voici ma table utilisateurs :

    Schema::create('utilisateurs', function (Blueprint $table) {
    $table->bigIncrements('user_id');
    / ID en foreign key /
    $table->bigInteger('user_pp_id');
    / reste /
    $table->string('user_login');
    $table->string('user_password');
    $table->string('user_email');
    $table->string('user_type')->default('user'); //user,admin, superadmin

    $table->foreign('user_pp_id')->references('pp_id')->on('personnes_physiques');
    $table->unique('user_email');
    $table->unique('user_login');

    $table->timestamp('user_email_verified_at')->nullable();
    $table->rememberToken();
    $table->timestamps();
    });

    J'aimerai avoir une partie front avec possibilité de se connecter en user, et une partie admin uniquement disponible pour les admin et superadmin (champ user_type qui permet le switch).
    Je souhaiterai de plus pouvoir m'authentifier sois via le login, sois via le mail.

    Et ceci entièrement en surclassage.

    Est-ce possible déjà et pourrais-je avoir des pistes car pour ma part la doc est un peu indigeste et incompréhensible.

  • Avatar de nash
    Membre depuis :
    16/04/2019
    Messages :
    14

    Bonjour,

    En gros tu reinvente la roue.
    L'authentification de laravel par defaut est completement extensible (Model, Metier et IHM).
    Tu peux tres bien mettre en place une gestion multi-roles avec niveau d'acces front et back.

  • Avatar de Gru67
    Membre depuis :
    16/04/2019
    Messages :
    4

    Je n'ai pas vu une seule solution de multi-authentification avec une seule table en faite...
    Je réinvente peut-être la roue, mais je souhaite juste que la solution s'adapte à mes besoins, pas l'inverse.

  • Avatar de nash
    Membre depuis :
    16/04/2019
    Messages :
    14

    Je n'ai pas vu une seule solution de multi-authentification avec une seule table en faite...
    Laravel fait deja cela avec une seule table rien ne tempeche de la modifier

  • Avatar de Gru67
    Membre depuis :
    16/04/2019
    Messages :
    4

    Heu...
    Tout se que je trouve c'est se genre d'éléments https://www.pusher.com/tutorials/multiple-authentication-guards-laravel
    où ils utilise plusieurs tables. Je ne suis pas encore tombé sur la solution qui permet de gardé la table user avec un string qui permet la gestion des 4-5 rôles que je vais lui attribuer avec deux endroit de connexion bien distinct.
    Je suis donc ici pour savoir si ceci est possible et si oui, avoir quelques éléments pour m'aider.

    Merci.

  • Avatar de nash
    Membre depuis :
    16/04/2019
    Messages :
    14

    Si je reprends ton schema:

    $table->string('user_type')->default('user'); //user,admin, superadmin

    tu as simplement à convertir un array de roles en json à l'insertion.
    A l'dentification tu fais la manipulation inverse.
    Il faut savoir que toutes les methodes de l'authentification sont surchargable.
    De plus avec un middleware tu as possibilité d'affiner les règles.

  • Avatar de Gru67
    Membre depuis :
    16/04/2019
    Messages :
    4

    Donc je reviens avec le même problème mais j'ai réussi une bonne partie.
    Actuellement le problème que j'ai, c'est le manque de visuel en cas d'erreur, et un refresh obligatoire pour la connexion.
    Si vous avez des piste je suis preneur.

    Voici mes éléments actuelle (j'ai une partie auth avec mon user que j'ai laisser le temps du test) :

    Mon Modèle Utilisateurs (app/Models/Utilisateurs.php)

    //use Illuminate\Database\Eloquent\Model;
    //use Illuminate\Contracts\Auth\Authenticatable;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;

    class Utilisateurs extends Authenticatable
    {

    use Notifiable;

    protected $table = 'utilisateurs';
    protected $guard = "utilisateurs";
    protected $primaryKey = 'user_id';
    protected $username = 'user_login';

    protected $fillable = [
    'user_login', 'user_password', 'user_email', 'user_type', 'user_pp_id'
    ];

    protected $hidden = [
    'user_password', 'remember_token'
    ];

    protected $casts = [
    'user_email_verified_at' => 'datetime',
    ];

    public function getAuthPassword()
    {
    return $this->user_password;
    }

    public function isAdmin()
    {
    try{
    switch($this->user_type)
    {
    case 'superadmin' :
    case 'admin' :
    case 'marchant' :
    return true;
    default :
    return false;
    }
    }
    catch (Exception $e)
    {
    echo 'Caught exception: ', $e->getMessage(), "\n";
    return false;
    }

    }

    Update config/auth.php :

    'guards' => [
    'web' => [
    'driver' => 'session',
    'provider' => 'users',
    ],

    'api' => [
    'driver' => 'token',
    'provider' => 'users',
    'hash' => false,
    ],
    // add Admin guards
    'admin' => [
    'driver' => 'session',
    'provider' => 'admin'
    ],
    'admin-api' => [
    'driver' => 'token',
    'provider' => 'utilisateurs',
    'hash' => false,
    ],

    ],
    /[...]/
    'providers' => [
    'users' => [
    'driver' => 'eloquent',
    'model' => App\User::class,
    ],
    // add Admin Provider
    'admin' => [
    'driver' => 'eloquent',
    'model' => App\Models\Utilisateurs::class,
    ],
    ],
    /[...]/
    'passwords' => [
    'users' => [
    'provider' => 'users',
    'table' => 'password_resets',
    'expire' => 60,
    ],
    'admin' => [
    'provider' => 'utilisateurs',
    'table' => 'password_resets',
    'expire' => 60,
    ],
    ],

    Update app/Http/Controller/Auth/LoginController.php

    /*
    Ajout Pour l'admin
    */
    public function showLoginForm()
    {
    return view('auth.login');
    }

    Update routes/web.php

    /*
    Partie Admin !!!
    /
    Route::prefix('admin')->group(function(){
    Route::get('/login', 'Auth\AdminLoginController@showLoginForm')->name('admin.login');
    Route::post('/login', 'Auth\AdminLoginController@login')->name('admin.login.submit');
    Route::get('/home', 'AdminController@index')->name('Back/admin.home');

    });
    Route::middleware('auth:admin')->group(function () {
    /
    listes des marchants */
    Route::get('/admin/test', 'Back\PagesController@getTest')->name('test');
    });
    });

    Update app/Http/Middleware/RedirectIfAuthenticated.php

    public function handle($request, Closure $next, $guard = null)
    {

    switch ($guard) {
    case 'admin' :

    if (Auth::guard($guard)->check()) {

    // Auth::guard($guard)->setUser(Auth::guard($guard)->getUser()); // j'ai test ça mais rien n'y fait.
    // Je passe bien ici mais ne se le Auth::guard($gaurd)->User() = null
    return redirect()->route('test');
    }
    break;
    default:
    if (Auth::guard($guard)->check()) {
    return redirect()->route('home');
    }
    break;
    }
    return $next($request);
    }

    Update app/Exceptions/Handler.php

    /*
    Ajout Admin
    */

    protected function unauthenticated($request, AuthenticationException $exception)
    {
    if ($request->expectsJson()) {
    return response()->json(['error' => 'Unauthenticated.'],401);
    }
    $guard = array_get($exception->guards(), 0);
    switch ($guard) {
    case 'admin': $login = 'admin.login';
    break;
    default: $login = 'login';
    break;
    }
    return redirect()->guest(route($login));
    }

    Add app/Http/Controller/Back/LoginController.php

    namespace App\Http\Controllers\Back;

    class LoginController
    {
    /
    Create a new controller instance.

    @return void
    /
    public function __construct()
    {
    $this->middleware('auth:admin');
    }
    /

    Show the application dashboard.

    @return \Illuminate\Http\Response
    /
    public function index()
    {
    return view('admin');
    }
    }

    Add app/Http/Controller/Auth/AdminLoginController.php

    use App\Models\Utilisateurs;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\Hash;

    class AdminLoginController extends Controller
    {
    /
    Show the application’s login form.

    @return \Illuminate\Http\Response
    /

    protected $userlogin = 'user_login';
    protected $usermail = 'user_email';
    protected $password = 'user_password';

    public function showLoginForm()
    {
    return view('auth\admin-login');
    }
    protected function guard(){
    return Auth::guard('admin');
    }

    use AuthenticatesUsers;
    /

    Where to redirect users after login.

    @var string
    /
    protected $redirectTo = '/admin/dashboard';
    /
    Create a new controller instance.

    @return void
    /
    public function __construct()
    {
    $this->middleware('guest:admin')->except('logout');
    }

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

    public function userLogin()
    {
    return $this->userlogin;
    }

    public function userMail()
    {
    return $this->usermail;
    }

    public function getAuthPassword()
    {
    return $this->password;
    }

    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);
    }

    /

    Permet la connexion soit via mail, soit via login
    /
    $user=Utilisateurs::where($this->username(), '=', $request[$this->username()])->first();
    if(empty($user)){$user=Utilisateurs::where('user_login', '=', $request[$this->userLogin()])->first();}
    if(empty($user)){$user=Utilisateurs::where('user_email', '=', $request[$this->userMail()])->first();}

    if(!empty($user))
    {
    if(Hash::check($request[$this->getAuthPassword()], $user[$this->getAuthPassword()]))
    {
    $this->guard()->login($user, true);
    }
    else
    {
    return back()->withInput($request->only($this->username(), 'remember'));
    // n'a pas réussi à se co.
    }
    }

    }

    protected function validateLogin(Request $request)
    {
    $request->validate([
    $this->username() => 'required|string',
    $this->getAuthPassword() => 'required|string',
    ]);
    }

    }

    Add resources/views/auth/admin-login.blade.php

    <?php
    /*
    Created by PhpStorm.
    User: MICHIERE
    Date: 23/04/2019
    Time: 10:07
    /

    ?>
    @extends('layouts.app')

    @section('content')
    <div class="container">
    <div class="row justify-content-center">
    <div class="col-md-8">
    <div class="card">
    <div class="card-header">{{ ('Admin Login') }}</div>

    <div class="card-body">
    <form method="POST" action="{{ route('admin.login.submit') }}">
    @csrf

    <div class="form-group row">
    <label for="user_login" class="col-md-4 col-form-label text-md-right">{{ __('Login') }}</label>

    <div class="col-md-6">
    <input id="user_login" type="text" class="form-control{{ $errors->has('user_login') ? ' is-invalid' : '' }}" name="user_login" value="{{ old('user_login') }}" required autofocus>

    @if ($errors->has('user_login'))
    <span class="invalid-feedback" role="alert">
    <strong>{{ $errors->first('user_login') }}</strong>
    </span>
    @endif
    </div>
    <!--<div class="col-md-6">
    <input id="name" type="text" class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}" name="email" value="{{ old('name') }}" required autofocus>

    @if ($errors->has('name'))
    <span class="invalid-feedback" role="alert">
    <strong>{{ $errors->first('name') }}</strong>
    </span>
    @endif
    </div>-->
    </div>

    <div class="form-group row">
    <label for="user_password" class="col-md-4 col-form-label text-md-right">{{
    ('Password') }}</label>

    <div class="col-md-6">
    <input id="user_password" type="password" class="form-control{{ $errors->has('user_password') ? ' is-invalid' : '' }}" name="user_password" required>

    @if ($errors->has('user_password'))
    <span class="invalid-feedback" role="alert">
    <strong>{{ $errors->first('user_password') }}</strong>
    </span>
    @endif
    </div>
    </div>

    <div class="form-group row">
    <div class="col-md-6 offset-md-4">
    <div class="form-check">
    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

    <label class="form-check-label" for="remember">
    {{ ('Remember Me') }}
    </label>
    </div>
    </div>
    </div>

    <div class="form-group row mb-0">
    <div class="col-md-8 offset-md-4">
    <button type="submit" class="btn btn-primary">
    {{
    ('Login') }}
    </button>

    @if (Route::has('password.request'))
    <a class="btn btn-link" href="{{ route('password.request') }}">
    {{ __('Forgot Your Password?') }}
    </a>
    @endif
    </div>
    </div>
    </form>
    </div>
    </div>
    </div>
    </div>
    </div>
    @endsection

    Si vous voyez quelque chose, je suis prenneur.

    Merci d'avance !!!!

Vous ne pouvez pas répondre à ce sujet.