2016-10-14 30 views
6

Tôi có Laravel 5.3 với ba loại người dùng khác nhau. Tôi muốn họ được chuyển hướng đến trang bảng điều khiển khác nhau sau khi đăng nhập Ví dụ:.Laravel 5.3 Đăng nhập chuyển hướng đến các trang khác nhau cho nhiều người dùng

sử dụng -> đăng nhập -> sử dụng bảng điều khiển

admin -> đăng nhập -> admin-dashboard

tôi đã tạo ra một middleware gọi 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); 

} 

đường

Route::group(['middleware' => ['auth','roles'], 'roles' => 'Admin'], function() { 
    // Routes here 
} 

Vai trò hoạt động hoàn hảo.

Hiện tại redirectTo= ''; trong LoginContoller chỉ cho một chế độ xem. Tôi đã kiểm tra tài liệu và tôi tin rằng điều này có liên quan đến các vệ sĩ không có giải thích về cách thiết lập tài liệu.

Tôi cũng đã thấy nhiều người dùng, nhưng tôi không nghĩ rằng việc tạo các bảng khác nhau cho những người dùng khác nhau và do đó tìm kiếm câu trả lời thay thế là khôn ngoan.

Mọi đề xuất sẽ được đánh giá cao.

bảng của tôi là như sau:

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 

Đây có thể là một bản sao của câu hỏi dưới đây nhưng câu trả lời lá được cung cấp mà không giải thích nhiều chuyển hướng.

Multiple Authentication in Laravel 5.3

Trả lời

4

Thực hiện một phương pháp authenticated() trong LoginController của bạn và thêm logic chuyển hướng có :

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

    // ... 
} 

Phương pháp này là ca lled sau khi người dùng được xác thực. Xem hai dòng cuối cùng của 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()); 
} 

Vì vậy, đây là một ứng cử viên hoàn hảo cho các lôgic đó.

Một lưu ý khác về câu trả lời của riêng bạn, các AuthenticatesUser là một đặc điểm mà theo chiều ngang kéo dài LoginController, bạn có thể yên tâm ghi đè lên bất kỳ các phương pháp của nó trong điều khiển của bạn mà không cần chạm các tập tin cốt lõi.

0

Dường như giải pháp dưới đây vượt quá quy trình và thực hiện công việc. Nhưng tôi không nghĩ đó là cách đúng đắn khi chúng tôi đang làm việc với các tệp Core. Một số cơ thể xin vui lòng ném một ánh sáng về điều này.

Đi tới đặc điểm AuthenticatesUser.php.

xác định vị trí SendLoginResponse (Request $ request)

Trước khi trở về đường dẫn mặc định thêm conditions.I của bạn đã thay đổi nó xuống dướ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

Cách tốt nhất (tôi đã tìm thấy) để thực hiện việc đó là sử dụng Traits. Những gì chúng ta sẽ làm là bassically giống nhau nhưng ít phức tạp và có cấu trúc hơn:

1. Thay vì tạo hai bảng, Mô hình người dùng của chúng tôi sẽ có một trường vai trò, trong trường hợp của tôi, tôi sẽ có: 'admin ',' nhân viên 'và' người dùng '.

2. Chúng tôi sẽ tạo Thư mục tra cứu, trong trường hợp này, nó sẽ được đặt trong App/Http.

3. Chúng tôi sẽ tạo ra một tập tin mới và gọi nó là RedirectTrait.php bên trong thư mục đó với nội dung này:

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

} 

Như bạn có thể thấy, chúng ta có thể 'chơi' với chuyển hướng, nhưng dự định là cần thiết Theo tài liệu của laravel:

Phương pháp dự định trên redirector sẽ chuyển hướng người dùng đến URL mà họ đang cố gắng truy cập trước khi bị chặn bởi phần mềm trung gian xác thực. URI dự phòng có thể được cung cấp cho phương pháp này trong trường hợp đích đến dự định không có sẵn.

4. Cuối cùng, chúng tôi sẽ đặt đặc điểm và gọi nó là:

  • Trong App/Http/Controllers/Auth/LoginController.php tập tin
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); 
    } 

    ... 
    } 

Chúng tôi đang ghi đè 'chứng thực 'phương pháp được đặt trong Illuminate\Foundation\Auth\AuthenticatesUsers (được bỏ trống bằng cách này)

  • Chúng tôi sẽ làm điều tương tự trong file App/Http/Controllers/Auth/RegisterController.php, nhưng phương pháp này sẽ có một cái tên khác nhau một cách tự nhiên:
/** 
* 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); 
} 

Chúng tôi đang ghi đè lên các phương pháp 'chuyển hướng' lưu trữ trong Illuminate\Foundation\Auth\RegistersUsers, và cũng trống rỗng.

5. Thưởng thức: D

PS. Đặt lại mật khẩu chuyển hướng là một lịch sử khác.

Các vấn đề liên quan