2017-02-11 63 views
9

後我使用Laravel框架5.4.10,而我使用的是常規的身份驗證Laravel 5.4重定向到自定義網址登錄

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); 
} 

這一切都很好,除了當我點擊登錄按鈕,我被重定向到「/」,而不是「/主題」。如果我不需要在控制器中進行身份驗證(Controller.php文件中沒有__結構函數),則在登錄時我會重定向。我究竟做錯了什麼?

回答

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既可以是方法也可以是變量。

這是我現在在我的認證控制器中的。

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():」更改爲「案例Bouncer :: allowed('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'); 
}