Я использую Laravel Framework 5.4.10, и я использую обычную проверку подлинности,
php artisan make:auth
обеспечивает. Я хочу защитить все приложение и перенаправить пользователей в / темы после входа в систему.
У меня есть 4 контроллера: ForgotPasswordController.php, LoginController.php, RegisterController.php и ResetPasswordController.php. Я редактировал эту строку в последние три:
protected $redirectTo = '/themes';
Это первая строка на моих маршрутах / web.php:
Auth::routes();
Я добавил эту функцию в свой Controller.php:
public function __construct() { $this->middleware('auth'); }
Я отредактировал приложение / Http / Middleware / RedirectIfAuthenticated.php, так что функция дескриптора выглядит так:
public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { return redirect('/themes'); } return $next($request); }
Все в порядке, за исключением случаев, когда я нажимаю кнопку «Логин», меня перенаправляют на «/», а не «/ themes». Если мне не требуется аутентификация в контроллерах (нет функции __contruct в файле Controller.php), я получаю перенаправление OK при входе в систему. Что я делаю не так?
Это то, что я работаю, что совпадение.
Вам также необходимо добавить следующие строки в свой LoginController
namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */ use AuthenticatesUsers; protected function authenticated(Request $request, $user) { if ( $user->isAdmin() ) {// do your margic here return redirect()->route('dashboard'); } return redirect('/home'); } /** * Where to redirect users after login. * * @var string */ //protected $redirectTo = '/admin'; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest', ['except' => 'logout']); } }
Если вы посмотрите в признаке AuthenticatesUsers, вы увидите, что в методе sendLoginResponse есть вызов, сделанный в $this->redirectPath()
. Если вы посмотрите на этот метод, вы обнаружите, что redirectTo может быть либо методом, либо переменной.
Это то, что я сейчас имею в своем контроллере.
public function redirectTo() { $user = Auth::user(); switch(true) { case $user->isInstructor(): return '/instructor'; break; case $user->isAdmin(): case $user->isSuperAdmin(): return '/admin'; break; default: return '/account'; } }
То, как я это сделал, используя свойство AuthenticatesUsers.
\App\Http\Controllers\Auth\LoginController.php
Добавьте этот метод к этому контроллеру:
/** * Check user's role and redirect user based on their role * @return */ public function authenticated() { if(auth()->user()->hasRole('admin')) { return redirect('/admin/dashboard'); } return redirect('/user/dashboard'); }
Вы должны установить значение $ redirectTo для маршрута, для которого вы хотите перенаправить
$this->redirectTo = route('dashboard');
внутри конструктора AuthController.
/** * Where to redirect users after login / registration. * * @var string */ protected $redirectTo = '/'; /** * Create a new authentication controller instance. * * @return void */ public function __construct() { $this->middleware($this->guestMiddleware(), ['except' => 'logout']); $this->redirectTo = route('dashboard'); }