web-dev-qa-db-fra.com

Authentifiez les utilisateurs de plus de deux tables dans laravel 5

Comme je le sais Auth::attempt est utilisé pour authentifier les utilisateurs à partir de la table users, mais je souhaite authentifier un autre utilisateur à partir de la table managers et l'administrateur à partir de la table admins. Je sais qu'il y a laravel-multiauth le plugin existe déjà. Mais pouvons-nous créer notre propre AuthServiceProvider pour authentifier les utilisateurs à partir de plusieurs tables ..?

23
RAUSHAN KUMAR

Créez d'abord l'administrateur authentifiable dans Illuminate\Foundation\Auth comme

    <?php

namespace Illuminate\Foundation\Auth;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

    class Admin extends Model implements
        AuthenticatableContract,
        AuthorizableContract,
        CanResetPasswordContract
    {
        use Authenticatable, Authorizable, CanResetPassword;
    }

Créez ensuite le modèle d'administration en étendant Authenticatable Modèle d'administrateur: -

  <?php
namespace App;
use Illuminate\Foundation\Auth\Admin as Authenticatable;

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

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

Après cela, vous devez modifier config/auth.php comme ci-dessous Ajouter dans fournisseurs tableau

'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ], 

et ajouter gardes tableau.

 'user' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
 'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

Maintenant, authentifiez-vous à partir de la table tilisateur

 if (Auth::guard('user')->attempt(['email' => $email, 'password' => $password])) {
        $details = Auth::guard('user')->user();
        $user = $details['original'];
        return $user;
    } else {
        return 'auth fail';
    }

Et pour s'authentifier à partir de la table Admin

 if (Auth::guard('admin')->attempt(['email' => $email, 'password' => $password])) {
        $details = Auth::guard('admin')->user();
        $user = $details['original'];
        return $user;
    } else {
        return 'auth fail';
    }
9
Shams Reza

Vous pouvez configurer plusieurs gardes d'authentification, chacun ayant un fournisseur différent. Les fournisseurs définissent la table ou le modèle à utiliser.

Dans config/auth.php vous configurez le providers comme suit et vous configurez également le guards correspondant pour chacun de ces fournisseurs:

'providers' => [
    'users'  => [
        'driver' => 'eloquent',
        'model'  => App\User::class,
    ],
    'managers'  => [
        'driver' => 'eloquent',
        'model'  => App\Manager::class,
    ],
    'admins'  => [
        'driver' => 'eloquent',
        'model'  => App\Admin::class,
    ]
]

Ensuite, vous pouvez vous authentifier comme ceci:

Auth::attempt($credentials) // use default guard for simple users
Auth::guard('manager')->attempt($credentials)
Auth::guard('admin')->attempt($credentials)

Consultez les documents ici .

12
achillesp

Essayez mon idée si vous le souhaitez. Je m'attends à ce que différents table aient différents users. Parce que cela ne fonctionnera pas si vous avez le même user dans d'autres tables.

  1. Choisissez votre table de priorité (par exemple, les utilisateurs)
  2. Ajoutez la condition
    • if(Auth::user(attempt(...))
    • elseif(Auth::manager(attempt(...))
    • elseif(Auth::admins(attempt(...)))

Remarque: Votre table de priorité ici est users, puis si l'utilisateur n'existe pas dans cette table, il essaiera la table managers, puis s'il n'existe toujours pas, il vérifiera la admins table, sinon (utilisez else) retourne une erreur de message.

Autre option:

Une autre option consiste à utiliser ce package sarav/laravel-multiauth. Vous pouvez suivre ce fil. Comment utiliser l'authentification pour plusieurs tables dans Laravel 5 pour plus d'informations.

Plus de référence:

https://laracasts.com/discuss/channels/general-discussion/using-laravel-auth-for-multiple-tables?page=1

Quelqu'un peut-il expliquer Laravel 5.2 Multi Auth avec exemple

https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1

7
Jonjie

Créez un modèle pour la table des gestionnaires et la table des administrateurs. Ce modèle devrait étendre Illuminate\Foundation\Auth\User

Dans config/auth.php,

Ajoutez au tableau des fournisseurs:

'managers' => [
    'driver' => 'eloquent',
    'model' => App\Manager::class,
 ],

Ajoutez au tableau des gardes:

'web_manager' => [
    'driver' => 'session',
    'provider' => 'managers',
 ],

Ensuite. dans LoginController (créez-en un pour le gestionnaire en utilisant php artisan make:auth) utilisez le trait Illuminate\Foundation\Auth\AuthenticatesUsers et remplacez les propriétés de garde et de redirection.

protected $redirectTo = 'redirect_path_after_manager_login';

protected function guard()
{
  return Auth::guard('web_manager');
}

Le modèle de gestionnaire est authentifié et vous pouvez obtenir l'objet du gestionnaire authentifié Auth::guard('web_manager')->user();

3
Sanzeeb Aryal