Czy ktoś może wyjaśnić Laravel 5.2 Multi Auth na przykładzie

172

Próbuję uwierzytelniać użytkowników i administratora formularz userstół i adminstolik odpowiednio. Używam Usermodelu dostarczonego przez laravel po wyjęciu z pudełka i utworzyłem to samo, ponieważ Admin.dodałem klucz strażnika i klucz dostawcy doauth.php.

Gwardia

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

Dostawcy

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

Trasy

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

Utworzyłem katalog o nazwie, w AuthAdminktórym znajdują się ustawienia domyślne Laravel AuthController.phpi PasswordController.phppliki. (Przestrzeń nazw odpowiednio zmodyfikowana)

Po pierwsze, w dokumentach Laravela wspomniałem, że jak określić ochronę niestandardową podczas uwierzytelniania w ten sposób, co nie działa.
wprowadź opis obrazu tutaj

W dokumentach Laravela wspomniano o innej metodzie użycia strażnika, który również nie działa.

wprowadź opis obrazu tutaj

Byłoby korzystne, gdyby ktoś mógł rozwiązać problemy i poprawić mnie, jeśli się mylę.

imrealashu
źródło
Laravel naprawił błąd w wersji 5.2.6. protected $guard = 'guard_name'może być teraz używany.
imrealashu
W Laravel dostępnych jest wiele pakietów generatorów panelu administracyjnego. Wolę administratora Voyager. Instalacja ich jest łatwa i prosta. Może to zaoszczędzić mnóstwo kodu. Musisz tylko zrozumieć, jak to działa. Nie odkrywaj na nowo koła. Voyager - The Missing Laravel Admin Aplikacja Laravel z szablonem administratora bootstrap Gentelella.
sathish R

Odpowiedzi:

201

Po wielu poszukiwaniach i wielu pytaniach i odpowiedziach w końcu udało mi się pracować z Laravel 5.2 Multi Auth z dwoma tabelami, więc piszę odpowiedź na moje własne pytanie.

Jak zaimplementować Multi Auth w Larvel 5.2

Jak wspomniano powyżej. Dwa stoliki adminiusers

Laravel 5.2 ma nowe artisanpolecenie.

php artisan make:auth

wygeneruje podstawowe login / register route, viewa controllerna userstole.

Zrób adminstół jako usersstół dla prostoty.

Kontroler dla administratora
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(uwaga: właśnie skopiowałem te pliki app/Http/Controllers/Auth/AuthControllerstąd)

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

Dodaj dwie metody i określ $redirectToi$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');
}  

pomoże ci otworzyć kolejny formularz logowania dla administratora

tworzenie oprogramowania pośredniczącego dla platformy 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);
}

}

zarejestruj oprogramowanie pośredniczące w kernel.php

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

użyj tego oprogramowania pośredniego AdminController np.

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

To wszystko jest potrzebne, aby działał, a także aby uzyskać plik JSON uwierzytelnionego użytku administratora
Auth::guard('admin')->user()

Edycja - 1
Możemy uzyskać dostęp do uwierzytelnionego użytkownika bezpośrednio za pomocą,
Auth::user() ale jeśli masz dwie tabele uwierzytelniania, musisz użyć

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

do wylogowania

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

dla uwierzytelnionego użytkownika json

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

Edytuj 2

Teraz możesz pobrać projekt zaimplementowany w Laravel 5.2 Multiauth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/

imrealashu
źródło
wielkie dzięki stary, właśnie tego szukałem, działało z niewielką modyfikacją. wielkie dzięki +1 dla Q i +1 dla Ans, szkoda, że ​​nie mogę +1 więcej. wielkie dzięki ..
rummykhan
@imrealashu, Ponieważ stworzyłem projekt zgodnie z twoją odpowiedzią. Ale generuje błąd wielu klas o tej samej nazwie. A co z tym? Jeśli zmienię nazwę klasy na uprawnienia administratora, to gdzie muszę dokonać zmian?
Akshay Vaghasiya
1
czy możesz również wyjaśnić, jak „zresetować hasło” dla ochrony administratora.
Shoaib Rehan
1
Dzięki za doskonałe wyjaśnienie wszystko mi się bardzo przydało. Aby użyć gościa oprogramowania pośredniego, zmień plik RedirectIfAuthenticated.php w następującym wierszu: Oryginał: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } Po zmianie: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza
1
@Jeffz to tylko z powodu złej dokumentacji i braku działających przykładów na multi-auth. Oczekujemy dobrej dokumentacji i nowych fajnych funkcji w tej aktualizacji 5.3.
imrealashu
2

Na wypadek, gdyby to komukolwiek pomogło, a może to być spowodowane moim brakiem zrozumienia oprogramowania pośredniczącego, oto, co musiałem zrobić, aby to działało (oprócz kroków podjętych przez @imrealashu) ...

W route.php:

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

To jest w webgrupie oprogramowania pośredniego. Wcześniej próbowałem umieścić go w osobnej admingrupie oprogramowania pośredniego, a nawet w auth:admingrupie, ale to nie zadziałało, działało tylko dla mnie, gdy określiłem oprogramowanie pośrednie jako administratora na samej trasie. Nie mam pojęcia, dlaczego tak jest, ale mam nadzieję, że oszczędza to innym wyrywania włosów tak, jak ja.

Sworrub Wehttam
źródło
Ściągnąłem twój plik zip z wieloma autoryzacjami zastąpiony plikami projektu ezisting, a po migracji mojej bazy danych ten błąd pokazuje .. [Symfony \ Component \ Console \ Exception \ RuntimeException] Za mało argumentów (brak: "nazwa").
G Naga Subrahmanyam
Właściwie dla mnie admin się loguje, ale nie jest przekierowywany do administratora. Po wykonaniu tej czynności, czy możesz powiedzieć, dlaczego tak jest? Muszę zarejestrować inne trasy, ponieważ jest to możliwe, Route::group(['middleware' => ['admin']], function () { //Admin Routes... });ponieważ nie działa dla mnie
Leap Hawk
0

W Laravel 5.6 jest to bardzo łatwe. Po prostu przejdź do config/auth.phpi dodaj tę linię w providerstablicy:

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

Zauważ, że użyliśmy databasedla sterownika nie eloquent.

Teraz dodaj to do guardstablicy:

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

Gotowe! Użyj tego podczas pracy z tabelą administratorów:

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

Twoje zdrowie.

Niebo
źródło