Laravel 5.3 Войти переадресации на разные страницы для нескольких пользователей

У меня Laravel 5.3 с тремя разными типами пользователей. Я хочу, чтобы они были перенаправлены на разные страницы панели управления после входа в систему. Например:

user -> login -> user-dashboard

admin -> login -> admin-dashboard

Я создал промежуточное программное обеспечение под названием CheckRole :

 public function handle($request, Closure $next) { if($request->user() === null) { return response("Insufficient Permissions" , 401); } $actions = $request->route()->getAction(); $roles = isset($actions['roles']) ? $actions['roles'] : null; if($request->user()->hasAnyRole($roles) || !$roles) { return $next($request); } return response("Insufficient Permissions" , 401); } 

Маршруты

 Route::group(['middleware' => ['auth','roles'], 'roles' => 'Admin'], function () { // Routes here } 

Роли работают отлично.

Теперь redirectTo= ''; в LoginContoller указывает только на один вид. Я проверил документацию, и я считаю, что это имеет какое-то отношение к охранникам, у которых нет объяснений относительно того, как его настроить.

Я также видел multiauth, но я не думаю, что было бы разумно создавать разные таблицы для разных пользователей и, следовательно, искать альтернативный ответ.

Любое предложение будет оценено по достоинству.

Мои таблицы:

 Table users id | name | email --------- 1 | John | john@blah.com 2 | Michael | michael@blah.com Table roles id | name --------- 1 | Admin 2 | PrivilegedMember 3 | Subscriber Table user_role id | user_id | role_id ---------------------- 1 | 1 | 1 2 | 2 | 2 

Это может быть дубликат нижеследующего вопроса, но предоставленный ответ оставляет его без объяснения нескольких перенаправлений.

Множественная аутентификация в Laravel 5.3

Внедрите метод authenticated() в свой LoginController и добавьте туда логику перенаправления:

 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; class LoginController extends Controller { use AuthenticatesUsers; // ... /** * The user has been authenticated. * * @param \Illuminate\Http\Request $request * @param mixed $user * * @return mixed */ protected function authenticated(Request $request, $user) { if($user->hasRole('Admin')) { return redirect()->intended('admin'); } elseif ($user->hasRole('PrivilegedMember')) { return redirect()->intended('PriviligedMember/index'); } } // ... } 

Метод вызывается после аутентификации пользователя. См. Последние две строки sendLoginResponse :

 /** * Send the response after the user was authenticated. * * @param \Illuminate\Http\Request $request * * @return \Illuminate\Http\Response */ protected function sendLoginResponse(Request $request) { $request->session()->regenerate(); $this->clearLoginAttempts($request); return $this->authenticated($request, $this->guard()->user()) ?: redirect()->intended($this->redirectPath()); } 

Так что это идеальный кандидат на такие логики.

Еще одно замечание по вашему собственному ответу: AuthenticatesUser – это признак, который горизонтально расширяет LoginController , вы можете безопасно переопределить любые его методы в контроллере, не касаясь основных файлов.

Лучший способ (который я нашел) – это использовать Traits . Что мы будем делать, басически то же, но менее сложное и более структурированное:

1. Вместо создания двух таблиц наша Пользовательская модель будет иметь поле ролей, в моем случае у меня будут: «admin», «employee» и «user».

2. Мы собираемся создать папку «Черты», в этом случае она будет помещена в App/Http .

3. Мы собираемся создать новый файл и называть его RedirectTrait.php внутри этой папки с этим контентом:

 <?php namespace App\Http\Traits; // Or the place where the trait is stored (step 2) use Illuminate\Http\Request; trait RedirectTrait { /** * Where to redirect users after register/login/reset based in roles. * * @param \Iluminate\Http\Request $request * @param mixed $user * @return mixed */ public function RedirectBasedInRole(Request $request, $user) { $route = ''; switch ($user->role) { # Admin case 'admin': $route = '/admin/dashboard/route'; // the admin's route break; # Employee case 'employee': $route = '/employee/dashboard/route'; // the employee's route break; # User case 'user': $route = '/user/dashboard/route'; // the user's route break; default: break; } return redirect()->intended($route); } } 

Как вы можете видеть, мы можем «играть» с переадресацией, но предполагаемый необходим. Согласно документации laravel:

Назначенный метод перенаправления перенаправляет пользователя на URL-адрес, к которому они пытались получить доступ, до того, как будет перехвачен промежуточным программным обеспечением аутентификации. Резервный URI может быть предоставлен этому методу в случае, если предназначенный пункт назначения недоступен.

4. Наконец, мы поместим эту черту и назовем ее:

  • В файле App/Http/Controllers/Auth/LoginController.php
  use Illuminate\Http\Request; // Add use App\Http\Traits\RedirectTrait; // Call the trait class LoginController extends Controller { ... use RedirectTrait; // Use the trait /** * The user has been authenticated. * * @param \Illuminate\Http\Request $request * @param mixed $user * @return mixed */ protected function authenticated(Request $request, $user) { return $this->RedirectBasedInRole($request, $user); } ... } 

Мы переписываем метод «authenticated», помещенный в Illuminate\Foundation\Auth\AuthenticatesUsers (который, кстати, пуст)

  • Мы сделаем то же самое в файле App/Http/Controllers/Auth/RegisterController.php , но метод будет иметь другое имя:
 /** * The user has been registered. * * @param \Illuminate\Http\Request $request * @param mixed $user * @return mixed */ protected function registered(Request $request, $user) { return $this->RedirectBasedInRole($request, $user); } 

Мы перезаписываем метод «перенаправленный», хранящийся в Illuminate\Foundation\Auth\RegistersUsers , и также пуст.

5. Наслаждайтесь: D

PS. Сброс пароля – это еще одна история.

Похоже, что приведенное ниже решение преодолевает процесс и выполняет эту работу. Но я не думаю, что это правильный путь, поскольку мы играем с файлами Core. Некоторое тело, пожалуйста, пролистайте свет на это.

Перейдите в AuthenticatesUser.php.

найти SendLoginResponse (запрос $ request)

Перед возвратом пути по умолчанию добавьте свои условия. Я изменил его ниже

 protected function sendLoginResponse(Request $request) { $request->session()->regenerate(); $this->clearLoginAttempts($request); if(Auth::User()->hasRole('Admin')) { return redirect()->intended('admin'); } elseif (Auth::User()->hasRole('PrivilegedMember')) { return redirect()->intended('PriviligedMember/index'); } return $this->authenticated($request, $this->guard()->user()) ?: redirect()->intended($this->redirectPath()); }