У меня Laravel 5.3 с тремя разными типами пользователей. Я хочу, чтобы они были перенаправлены на разные страницы панели управления после входа в систему. Например:
user -> login -> user-dashboard
- Laravel 5.3 withCount () вложенное отношение
- МетодNotAllowedHttpException в строке RouteCollection.php 218: 4
- Отключить отчет об ошибках полностью в производстве Laravel?
- Laravel 5.3: Внедрение паспортов - {"error": "invalid_client", "message": "Ошибка аутентификации клиента}}
- Laravel 5.3 Пользовательский путь для перенаправления после аутентификации
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()); }