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 ..?
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';
}
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 .
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.
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:
Quelqu'un peut-il expliquer Laravel 5.2 Multi Auth avec exemple
https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1
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();