2016-10-14 78 views
6

我有Laravel 5.3與三種不同類型的用戶。我希望他們能夠在登錄後重定向到不同的儀表盤頁面,例如:Laravel 5.3登錄重定向到多個用戶的不同頁面

用戶 - >登錄 - >用戶儀表盤

管理 - >登錄 - >管理儀表板

我創建了一個名爲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 | [email protected] 
2 | Michael | [email protected] 

Table roles 

id | name 
--------- 
1 | Admin 
2 | PrivilegedMember 
3 | Subscriber 

Table user_role 

id | user_id | role_id 
---------------------- 
1 | 1 | 1 
2 | 2 | 2 

這可能是以下問題的重複,但答案提供葉子沒有解釋多重定向。

Multiple Authentication in Laravel 5.3

回答

4

LoginController實現一個authenticated()方法,並添加重定向邏輯有前:

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

    // ... 
} 

的方法是CA在用戶通過身份驗證後進行填充。見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,你可以安全地覆蓋你的控制器中的任何方法,而無需觸摸核心文件。

0

它看起來像在遊戲機下面的解決方案的過程中,並沒有工作。但我不認爲這是正確的方式,因爲我們正在修補核心文件。有些人請告訴我這件事。

轉到AuthenticatesUser.php特質。

定位SendLoginResponse(請求$要求)

返回默認路徑添加conditions.I已改成了以下

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

(我發現)最好的方法是使用Traits。我們要做的事情是相同但相對簡單但結構更復雜:

1.而不是創建兩個表,我們的用戶模型將有一個角色字段,在我的情況下,我會有:'管理員','員工'和'用戶'。

2.我們將創建Traits文件夾,在這種情況下,它將被放置在App/Http

我們要創建一個新的文件,以及與此內容稱之爲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); 
    } 

    ... 
    } 

我們覆蓋「認證'方法放在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。重置密碼重定向是另一個歷史記錄。

相關問題