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


172

J'essaye d'authentifier les utilisateurs et la table et la table de forme d' administration respectivement. J'utilise le modèle fourni par laravel hors de la boîte et je l'ai créé car j'ai ajouté une clé de garde et une clé de fournisseur dansuseradminUserAdmin.auth.php.

Gardes

'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

Fournisseurs

'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],

Itinéraires

Route::group(['middleware' => ['web']], function () {
    // Login Routes.   
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes.
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');
});

J'ai créé un répertoire appelé AuthAdminoù la valeur par défaut de Laravel AuthController.phpet les PasswordController.phpfichiers sont présents. (Espace de noms modifié en conséquence)

Tout d'abord, dans la documentation de Laravel, il est indiqué que la façon de spécifier une garde personnalisée tout en s'authentifiant comme celle-ci ne fonctionne pas.
entrez la description de l'image ici

Il existe une autre méthode mentionnée dans la documentation de Laravel pour utiliser un garde qui ne fonctionne pas trop.

entrez la description de l'image ici

Il serait avantageux que quelqu'un puisse résoudre les problèmes et me corriger si je me trompe.


Laravel a corrigé un bogue dans la version 5.2.6. protected $guard = 'guard_name'peut être utilisé maintenant.
imrealashu

Dans Laravel, il existe de nombreux packages de générateur de panneaux d'administration disponibles. Je préfère Voyager Admin. Les installer facilement et en toute simplicité. Cela peut vous faire économiser une tonne de code. Vous avez juste besoin de comprendre comment cela fonctionne. Ne réinventez pas la roue. Voyager - The Missing Laravel Admin Une application Laravel avec Gentelella bootstrap admin tempalte.
sathish R

Réponses:


201

Après beaucoup de fouilles et beaucoup de questions et réponses, j'ai finalement réussi à travailler Laravel 5.2 Multi Auth avec deux tables, donc j'écris la réponse à ma propre question.

Comment implémenter Multi Auth dans Larvel 5.2

Comme mentionné ci-dessus. Deux table adminetusers

Laravel 5.2 a une nouvelle artisancommande.

php artisan make:auth

il va générer login / registre de base route, viewet controllerpour usertable.

Faites un admintableau comme userstableau pour plus de simplicité.

Controller For Admin
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(note: je viens de copier ces fichiers à partir d' app/Http/Controllers/Auth/AuthControllerici)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],  

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});  

AdminAuth/AuthController.php

Ajoutez deux méthodes et spécifiez $redirectToet$guard

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

    return view('admin.auth.login');
}
public function showRegistrationForm()
{
    return view('admin.auth.register');
}  

cela vous aidera à ouvrir un autre formulaire de connexion pour l'administrateur

création d'un middleware pour admin

class RedirectIfNotAdmin
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @return mixed
 */
public function handle($request, Closure $next, $guard = 'admin')
{
    if (!Auth::guard($guard)->check()) {
        return redirect('/');
    }

    return $next($request);
}

}

enregistrer le middleware dans kernel.php

 protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];

utiliser ce middleware par AdminController exemple,

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('admin');
   }
public function index(){
        return view('admin.dashboard');
    }
}

C'est tout ce qui est nécessaire pour le faire fonctionner et aussi pour obtenir json d'utilisation authentifiée par l'administrateur
Auth::guard('admin')->user()

Edit - 1
Nous pouvons accéder directement à l'utilisateur authentifié en utilisant
Auth::user() mais si vous avez deux tables d'authentification, vous devez utiliser

Auth::guard('guard_name')->user()  

pour la déconnexion

Auth::guard('guard_name')->user()->logout()

pour l'utilisateur authentifié json

Auth::guard('guard_name')->user()  

Modifier 2

Vous pouvez maintenant télécharger le projet implémenté Laravel 5.2 Multiauth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/


merci beaucoup mec, c'est ce que je cherchais, cela a fonctionné avec un peu de modification. merci beaucoup +1 pour Q et +1 pour Ans, j'aimerais pouvoir +1 de plus. merci beaucoup ..
ramikhan

@imrealashu, comme j'ai créé un projet selon votre réponse. Mais cela génère une erreur de plusieurs classes avec le même nom. Alors qu'en est-il de ça? Si je change le nom de la classe pour l'authentification de l'administrateur, où dois-je faire des modifications?
Akshay Vaghasiya

1
pouvez-vous s'il vous plaît expliquer également comment "Réinitialiser le mot de passe" pour l'administrateur garde.
Shoaib Rehan

1
Merci pour l'excellente explication m'a été très utile tout. Pour utiliser l'invité middleware, modifiez le fichier RedirectIfAuthenticated.php de la ligne suivante: Original: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } Après la modification: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza

1
@Jeffz c'est juste à cause d'une mauvaise documentation et aucun exemple de travail sur multi-auth .. nous attendons une bonne documentation et oui les nouvelles fonctionnalités intéressantes de cette mise à jour 5.3.
imrealashu

2

Au cas où cela aiderait quelqu'un, et cela pourrait simplement être dû à mon manque de compréhension du middleware, voici ce que je devais faire pour que cela fonctionne (en plus des mesures prises par @imrealashu) ...

Dans route.php:

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => 'AdminController@index'
]);

C'est dans le webgroupe middleware. Avant cela, j'ai essayé de le placer dans un admingroupe de middleware séparé et même dans un auth:admingroupe, mais cela ne fonctionnait pas, cela ne fonctionnait pour moi que lorsque je spécifiais le middleware en tant qu'administrateur sur la route elle-même. Je ne sais pas pourquoi mais j'espère que cela évitera aux autres de s'arracher les cheveux comme je l'ai fait.


J'ai téléchargé votre fichier zip multi auth remplacé par des fichiers de projet ezisting puis lorsque je migre ma base de données, cette erreur s'affiche .. [Symfony \ Component \ Console \ Exception \ RuntimeException] Pas assez d'arguments (manquant: "nom").
G Naga Subrahmanyam

En fait, pour moi, l'administrateur se connecte mais n'est pas redirigé vers l'administrateur. Après cela, cela fonctionne, pouvez-vous s'il vous plaît dire pourquoi? Je dois enregistrer d'autres itinéraires car c'est possible Route::group(['middleware' => ['admin']], function () { //Admin Routes... });car cela ne fonctionne pas pour moi
Leap Hawk

0

C'est très simple dans laravel 5.6. Allez simplement à config/auth.phpet ajoutez cette ligne dans le providerstableau:

'admins' => [
   'driver' => 'database',
   'table' => 'admin_table'
]

Notez que nous avons utilisé databasepour le pilote non eloquent.

Maintenant, ajoutez ceci au guardstableau:

'admin_guard' => [
   'driver' => 'session',
   'provider' => 'admins'
]

Maintenant c'est fini! Utilisez ceci lorsque vous travaillez avec la table des administrateurs:

Auth::guard('admin_guard')->User();

À votre santé.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.