Вот пример того, что я использую в производстве для приложения, имеющего два пользовательских класса, которые должны быть зарегистрированы, чтобы получить доступ к своим отдельным ресурсам.Класс User использует стандартную аутентификацию Laravel без изменений, однако пользователи моего класса Admin используют это пользовательское промежуточное ПО:
<?php
namespace App\Http\Middleware;
use App\Admin;
use Closure;
use Illuminate\Support\Facades\Auth;
class AdminMiddleware
{
public function handle($request, Closure $next)
{
if (Auth::guest()) {
return redirect(route('admin.login'));
}
if (!$request->user() instanceof Admin) {
return redirect(route('restricted'));
}
return $next($request);
}
}
Я зарегистрировал AdminMiddleware в app/Http/Kernel.php
примерно так:
protected $routeMiddleware = [
'admin' => \App\Http\Middleware\AdminMiddleware::class,
/*** OTHER MIDDLEWARES ARE HERE ***/
];
В файле routes/web.php
я обернул маршруты следующим образом:
Route::group(['prefix' => 'admin', 'as' => 'admin.', 'middleware' => 'auth:admin'], function () {
/**** ADMIN ROUTES ARE HERE ****/
});
Route::group(['middleware' => 'auth'], function () {
/**** CLIENT ROUTES ARE HERE ****/
});
И у меня есть собственный AdminLoginController, который перезаписывает переменную пути $redirect
, а также guard()
, showLoginForm()
и redirectTo()
функционируют и выглядят так:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
class AdminLoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/admin/home';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function guard()
{
return Auth::guard('admin');
}
public function showLoginForm()
{
return view('auth.admin.login');
}
public function redirectTo()
{
return route('admin.home');
}
}
Наконец, в config/auth.php
у меня есть следующие ссылки на охранников, провайдеров и пароли:
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
'passwords' => [
'admin' => [
'provider' => 'admins',
'table' => 'password_resets',
'expire' => 60,
],
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
Конечноэто означает, что мои администраторы и пользователи хранятся в отдельных таблицах в базе данных, но это работает очень хорошо без каких-либо проблем, поэтому я в порядке с этим.