Я создаю пользовательскую систему аутентификации с ролями в Laravel-5.1.
У меня есть два набора пользователей, супервизоров и администраторов. Но у меня только одна страница входа. Поэтому, когда пользователь входит в систему, он сначала аутентифицирует свои учетные данные, затем я написал промежуточное программное обеспечение, которое проверяет, какой пользователь он является.
Если они администратор, он должен перенаправить их в /admin/home
. Если они являются руководителями, они должны перенаправлять их на supervisor/home
.
Я могу видеть из исходного файла Illuminate/Foundation/Auth/RedirectsUsers.php
что Illuminate/Foundation/Auth/RedirectsUsers.php
по умолчанию – /home
. Однако, как я могу изменить это, чтобы он стал динамичным?
Мой файл маршрутов:
/* Administrator Routes */ Route::group(['namespace' => 'Admin', 'middleware' => 'timesheets.admin:1'], function() { return Route::get('admin/home', 'AdminController@index'); }); /* Supervisor Routes */ Route::group(['namespace' => 'Supervisor', 'middleware' => 'timesheets.supervisor:2'], function() { return Route::get('supervisor/home', 'SupervisorController@index'); });
Мой файл промежуточного слоя:
<?php namespace App\Http\Middleware\Auth; use Closure, App; use Illuminate\Contracts\Auth\Guard; class AdminAuthenticate { /** * The Guard implementation. * * @var Guard */ protected $auth; /** * Create a new filter instance. * * @param Guard $auth * @return void */ public function __construct(Guard $auth) { $this->auth = $auth; } /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next, $role) { if ($this->auth->guest()) { if ($request->ajax()) { return response('Unauthorized.', 401); } else { return redirect()->guest('login'); } } /* Get user id */ $userId = $this->auth->user()->userId(); if (auth()->check() && auth()->user()->hasRole($userId, $role)) { return $next($request); } else { App::abort(403); } } }
Во-первых, установите $redirectPath
в вашем AuthController как:
$redirectPath = 'Path/to/standard/user/on/authentication'
Создайте новое промежуточное ПО Admin, которое будет выглядеть так:
public function handle($request, Closure $next) { if ( Auth::check() && Auth::user()->isAdmin() ) { return redirect('path/to/admin'); } return $next($request); }
Вам нужно будет создать новый метод в вашей модели пользователя для проверки администратора.
Вот так:
public function isAdmin() { return $this->admin; }
Это вернет значение вашего поля admin в таблице ваших пользователей.
Затем на вашем SupervisorController
__construct()
вы можете вызвать промежуточное ПО администратора:
public function __construct() { $this->middleware('admin'); }
Это приведет к тому, что администрация прибегает к стандартным входам, но перенаправляет их в дом администратора почти сразу.