Kann jemand Laravel 5.2 Multi Auth anhand eines Beispiels erklären?

171

Ich versuche zu authentifizieren Benutzer und Admin - Form userTabelle und adminjeweils Tabelle. Ich verwende das Uservon Laravel bereitgestellte Modell und habe es erstellt, da Admin.ich einen Schutzschlüssel und einen Providerschlüssel hinzugefügt habeauth.php.

Wachen

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

Anbieter

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

Routen

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

Ich habe ein Verzeichnis mit dem Namen AuthAdminLaravels Standard AuthController.phpund PasswordController.phpDateien erstellt. (Namespace entsprechend geändert)

Zunächst wurde in Laravels Dokumenten erwähnt, wie man einen benutzerdefinierten Schutz bei der Authentifizierung wie folgt angibt, was nicht funktioniert.
Geben Sie hier die Bildbeschreibung ein

In Laravels Dokumenten wird eine andere Methode erwähnt, um einen Schutz zu verwenden, der auch nicht funktioniert.

Geben Sie hier die Bildbeschreibung ein

Es wäre von Vorteil, wenn jemand die Probleme lösen und mich korrigieren könnte, wenn ich falsch liege.

imrealashu
quelle
Laravel hat einen Fehler in Version 5.2.6 behoben. protected $guard = 'guard_name'kann jetzt verwendet werden.
Imrealashu
In Laravel gibt es viele Admin-Panel-Generator-Pakete. Ich bevorzuge Voyager Admin. Die Installation ist einfach und problemlos. Es kann Ihnen eine Menge Code ersparen. Sie müssen nur verstehen, wie es funktioniert. Das Rad nicht neu erfinden. Voyager - The Missing Laravel Admin Eine Laravel-Anwendung mit Gentelella Bootstrap Admin Tempalte.
Sathish R

Antworten:

201

Nach vielem Graben und vielen Fragen und Antworten habe ich es endlich geschafft, Laravel 5.2 Multi Auth mit zwei Tabellen zu bearbeiten. Also schreibe ich die Antwort auf meine eigene Frage.

So implementieren Sie Multi Auth in Larvel 5.2

Wie oben erwähnt. Zwei Tisch adminundusers

Laravel 5.2 hat einen neuen artisanBefehl.

php artisan make:auth

wird es grundlegende Login / Register erzeugen route, viewund controllerfür userTabelle.

Machen Sie der Einfachheit halber eine adminTabelle als usersTabelle.

Controller für Administratoren
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(Hinweis: Ich habe diese Dateien gerade von app/Http/Controllers/Auth/AuthControllerhier kopiert )

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

Fügen Sie zwei Methoden hinzu und geben Sie $redirectTound an$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');
}  

Es wird Ihnen helfen, ein anderes Anmeldeformular für den Administrator zu öffnen

Erstellen einer Middleware für 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);
}

}}

Middleware registrieren in kernel.php

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

Verwenden Sie diese Middleware AdminController z.

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

Das ist alles, was benötigt wird, um es zum Laufen zu bringen und um die Verwendung von authentifizierten Administratoren zu ermöglichen
Auth::guard('admin')->user()

Bearbeiten - 1
Wir können direkt auf authentifizierte Benutzer zugreifen,
Auth::user() aber wenn Sie zwei Authentifizierungstabellen haben, müssen Sie verwenden

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

zum Abmelden

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

für authentifizierten Benutzer json

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

Bearbeiten 2

Jetzt können Sie das von Laravel 5.2 Multiauth implementierte Projekt http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/ herunterladen.

imrealashu
quelle
Vielen Dank Mann, das war es, wonach ich gesucht habe, es hat mit ein bisschen Modifikation funktioniert. Vielen Dank +1 für Q und +1 für Ans, ich wünschte, ich könnte +1 mehr.
Vielen
@imrealashu, Da ich ein Projekt gemäß Ihrer Antwort erstellt habe. Es werden jedoch Fehler mehrerer Klassen mit demselben Namen generiert. Was ist damit? Wenn ich den Klassennamen für die Administratorauthentifizierung ändere, wo muss ich dann Änderungen vornehmen?
Akshay Vaghasiya
1
Kannst du bitte auch erklären, wie man das Passwort für den Admin Guard zurücksetzt?
Shoaib Rehan
1
Danke für die hervorragende Erklärung war mir alles sehr nützlich. Um den Middleware-Gast zu verwenden, ändern Sie die Datei RedirectIfAuthenticated.php in der folgenden Zeile: Original: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } Nach der Änderung: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza
1
@ Jeffz ist nur wegen der schlechten Dokumentation und ohne Arbeitsbeispiele für Multi-Auth. Wir erwarten eine gute Dokumentation und ja, die neuen coolen Funktionen in diesem 5.3-Update.
Imrealashu
2

Falls dies jemandem hilft und dies möglicherweise nur auf mein mangelndes Verständnis der Middleware zurückzuführen ist, musste ich Folgendes tun, um dies zum Laufen zu bringen (zusätzlich zu den von @imrealashu unternommenen Schritten) ...

In route.php:

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

Dies ist in der webMiddleware-Gruppe. Vorher habe ich versucht, es in eine separate adminMiddleware-Gruppe und sogar in eine auth:adminGruppe zu stellen, aber das hat nicht funktioniert. Es hat nur für mich funktioniert, als ich die Middleware als Administrator auf der Route selbst angegeben habe. Ich habe keine Ahnung, warum das so ist, aber ich hoffe, es erspart anderen, sich die Haare auszureißen, wie ich es getan habe.

Sworrub Wehttam
quelle
Ich habe Ihre Multi-Auth-Zip-Datei heruntergeladen, die durch vorhandene Projektdateien ersetzt wurde. Wenn ich dann meine Datenbank migriere, wird dieser Fehler angezeigt. [Symfony \ Component \ Console \ Exception \ RuntimeException] Nicht genügend Argumente (fehlend: "name").
G Naga Subrahmanyam
Eigentlich meldet sich der Administrator an, wird aber nicht an den Administrator weitergeleitet. Nachdem dies funktioniert hat, können Sie bitte sagen, warum das so ist. Ich muss andere Routen registrieren, da dies möglich ist, da es Route::group(['middleware' => ['admin']], function () { //Admin Routes... });bei mir nicht funktioniert
Leap Hawk
0

In Laravel 5.6 ist das sehr einfach. Gehen Sie einfach zu config/auth.phpund fügen Sie diese Zeile im providersArray hinzu:

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

Beachten Sie, dass wir databasefür Treiber nicht verwendet haben eloquent.

Fügen Sie dies nun dem guardsArray hinzu:

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

Jetzt sind wir fertig! Verwenden Sie dies, wenn Sie mit der Admins-Tabelle arbeiten:

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

Prost.

Himmel
quelle