Qualcuno può spiegare Laravel 5.2 Multi Auth con l'esempio


172

Sto cercando di autenticare rispettivamente gli utenti e la tabella dei moduli di amministrazioneuser e la admintabella. Sto usando il Usermodello fornito da Laravel e Admin.ho creato lo stesso perché ho aggiunto una chiave di protezione e una chiave del provider inauth.php.

Guardie ✔

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

provider

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

Itinerari

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

Ho creato una directory chiamata in AuthAdmincui sono presenti i file AuthController.phpe le impostazioni predefinite di Laravel PasswordController.php. (Spazio dei nomi modificato di conseguenza)

Prima di tutto, nei documenti di Laravel menzionato che come specificare la protezione personalizzata durante l'autenticazione in questo modo che non funziona.
inserisci qui la descrizione dell'immagine

C'è un altro metodo menzionato nei documenti di Laravel per usare una guardia che non funziona troppo.

inserisci qui la descrizione dell'immagine

Sarebbe utile se qualcuno potesse risolvere i problemi e correggermi se sbaglio.


Laravel ha corretto un bug nella versione 5.2.6. protected $guard = 'guard_name'può essere usato ora.
imrealashu,

In Laravel ci sono molti pacchetti generatori del pannello di amministrazione disponibili. Preferisco Voyager Admin. Installarli facili e veloci. Potrebbe farti risparmiare un sacco di codice. Devi solo capire come funziona. Non reinventare la ruota. Voyager - The Missing Laravel Admin Un'applicazione Laravel con Gentelella bootstrap admin tempalte.
sathish R,

Risposte:


201

Dopo molte ricerche e molte domande e risposte sono finalmente riuscito a lavorare su Laravel 5.2 Multi Auth con due tabelle, quindi sto scrivendo la risposta alla mia domanda.

Come implementare Multi Auth in Larvel 5.2

Come menzionato sopra. Due tavoli admineusers

Laravel 5.2 ha un nuovo artisancomando.

php artisan make:auth

genererà base di login / registro route, viewe controllerper la usertavola.

Crea una admintabella come userstabella per semplicità.

Controller per amministratore
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(nota: ho appena copiato questi file da app/Http/Controllers/Auth/AuthControllerqui)

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

Aggiungi due metodi e specifica $redirectToe$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');
}  

ti aiuterà ad aprire un altro modulo di accesso per l'amministratore

creazione di un middleware per 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);
}

}

registra il middleware in kernel.php

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

usa questo middleware per AdminController es.

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

È tutto ciò che serve per farlo funzionare e anche per ottenere json dall'uso autenticato dell'amministratore
Auth::guard('admin')->user()

Modifica - 1
È possibile accedere direttamente all'utente autenticato utilizzando,
Auth::user() ma se si dispone di due tabelle di autenticazione, è necessario utilizzarle

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

per il logout

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

per l'utente autenticato json

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

Modifica 2

Ora puoi scaricare il progetto implementato di Laravel 5.2 Multiauth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/


grazie mille amico, era quello che stavo cercando, ha funzionato con un po 'di modifiche. grazie mille +1 per Q e +1 per Ans, vorrei poter fare +1 in più. grazie mille ..
rummykhan,

@imrealashu, come ho creato il progetto secondo la tua risposta. Ma genera errori di più classi con lo stesso nome. E allora? Se cambio il nome della classe per l'autorizzazione dell'amministratore, dove devo fare le modifiche?
Akshay Vaghasiya,

1
puoi per favore spiegare anche come "Reimpostare la password" per la guardia amministratore.
Shoaib Rehan

1
Grazie per l'eccellente spiegazione mi è stata molto utile tutto. Per utilizzare il guest del middleware, modificare il file RedirectIfAuthenticated.php nella riga seguente: Originale: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } dopo la modifica: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza,

1
@Jeffz è solo a causa della cattiva documentazione e degli esempi non funzionanti su multi-auth .. ci aspettiamo una buona documentazione e sì, le nuove fantastiche funzionalità di questo aggiornamento 5.3.
imrealashu,

2

Nel caso in cui questo aiuti qualcuno, e questo potrebbe essere dovuto alla mia scarsa comprensione del middleware, ecco cosa dovevo fare per farlo funzionare (oltre ai passi fatti da @imrealashu) ...

In route.php:

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

Questo è nel webgruppo middleware. Prima di questo ho provato a metterlo in un admingruppo di middleware separato e anche in un auth:admingruppo ma questo non ha funzionato, ha funzionato solo per me quando ho specificato il middleware come amministratore sulla route stessa. Non ho idea del perché, ma spero che salverà gli altri dal strapparsi i capelli come ho fatto io.


Ho scaricato il tuo file zip con più autorizzazioni sostituito con file di progetto ezisting, quindi quando eseguo la migrazione del mio DB questo errore mostra .. [Symfony \ Component \ Console \ Exception \ RuntimeException] Argomenti non sufficienti (mancante: "nome").
G Naga Subrahmanyam,

In realtà per me l'amministratore sta effettuando l'accesso ma non reindirizzato all'amministratore. Dopo averlo fatto, puoi dirmi perché? Devo registrare altri percorsi come è possibile Route::group(['middleware' => ['admin']], function () { //Admin Routes... });perché non funziona per me
Leap Hawk

0

È molto facile in laravel 5.6. Basta andare config/auth.phpe aggiungere questa riga nella providersmatrice:

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

Si noti che non abbiamo usato databaseper il driver eloquent.

Ora aggiungi questo guardsall'array:

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

Adesso abbiamo finito! Usalo quando lavori con la tabella degli amministratori:

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

Saluti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.