2017-02-11 3 views
9

Я использую Laravel Framework 5.4.10, и я использую регулярные проверки подлинности, чтоLaravel 5,4 перенаправление пользовательских URL после входа

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/Промежуточный/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 при входе в систему. Что я делаю не так?

ответ

18

Это то, что я действительно работаю, какое совпадение.

Кроме того, необходимо добавить следующие строки в ваш 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']); 
} 
} 
+0

Отлично! Единственное, что isAdmin() дал мне ошибку BadMethodCallException, поэтому я пропустил всю часть IF, и она отлично работала! – ivanacorovic

+1

Я рад, что это помогло, мое приложение использует isAdmin(), чтобы проверить, является ли пользователь администратором до перенаправления, не может иметь шанса измениться в соответствии с вашим кодом, просто хотел дать вам подсказку.Спасибо – Babagana

3

То, как я сделал это с помощью 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'); 
} 
4

Если вы посмотрите в AuthenticatesUsers черта вы увидите, что в методе sendLoginResponse, что есть вызов, сделанный на $this->redirectPath(). Если вы посмотрите на этот метод, вы обнаружите, что redirectTo может быть либо методом, либо переменной.

Это то, что я сейчас имею в своем контроллере auth.

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'; 
    } 
} 
+0

Перенаправление с использованием ролей доступа можно сделать таким же образом, используя библиотеку Bouncer (для тех, кто не пишет собственные методы контроля доступа). Просто измените «case $ user-> isInstructor():« на »case Bouncer :: разрешает ('isInstructor', $ user):". Очевидно, вам нужно будет добавить функцию «isInstructor» к роли пользователей. Если кто-то хочет, чтобы я опубликовал код Bouncer, который я использую в своем контроллере, дайте мне знать. – AKMorris

0

Вы должны установить значение $ 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'); 
}