From Laravel 5.2 a multi-authentication system has been made simple (I am pretty sure that in 5.3 the system remains the same), in this case we have two types of users to authenticate (admin and client), but can be scalable for more:
config / auth.php:
...
'guards' => [ // acrescentar aqui mais tipos de utilizadores a autenticar
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
'client' => [
'driver' => 'session',
'provider' => 'client',
],
],
'providers' => [ // acrescentar aqui mais tipos de utilizadores e respetivos models a autenticar
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
'client' => [
'driver' => 'eloquent',
'model' => App\Client::class,
],
],
...
Controller / method responsible for Admin authentication in this case, login form post:
public function admin_auth() {
$credentials = array(request()->email, request()->password);
if(!Auth::guard('admin')->attempt($credentials, request()->has('remember_me'))) { // note que no guard estou a especificar um dos que defini em 'config/auth'
return redirect('/'); // autenticação não foi bem sucedida
}
return redirect('/admin/dashboard'); // se entrar foi bem sucedida
}
Then on the route /admin/dashboard
, and other routes where you need to be authenticated, either client or admin:
Route::group(['middleware' => ['guest']], function() {
Route::get('/admin/dashboard', 'AdminController@home_dashboard'); // se entrar nesta rota é porque está autenticado e vamos para home do dashboard
}
In the middleware RedirectIfAuthenticated
we can have:
public function handle($request, Closure $next, $guard = null) {
$guards = array('admin', 'client'); // colocar também aqui os tipos de utilizadores com rotas autenticadas, os guards definidos em config/auth.php
$guard = $request->segments()[0]; // ajustar, neste caso o guard é o primeiro segmento do url, ex: http://exemplo.com/admin/... ou http://exemplo.com/client/..., em que o $guard vai ser admin ou client dependendo do que vem depois do ...com/
if(in_array($guard, $guards)) {
if(Auth::guard($guard)->check()) { // verificar se este tipo de utilizador, guard, está autenticado
return $next($request); // bem sucedido executar o código definido na rota (controlador/metodo)
}
}
return redirect('/'); // utilizador não autenticado, redirecionar
}