2017-02-11 42 views
9

Tôi đang sử dụng Laravel Khung 5.4.10, và tôi đang sử dụng xác thực thông thường màLaravel 5.4 chuyển hướng đến url tùy chỉnh sau khi đăng nhập

php artisan make:auth 

cung cấp. Tôi muốn bảo vệ toàn bộ ứng dụng và chuyển hướng người dùng đến/chủ đề sau khi đăng nhập.

Tôi có 4 bộ điều khiển: ForgotPasswordController.php, LoginController.php, RegisterController.php và ResetPasswordController.php. Tôi đã chỉnh sửa dòng này thành ba lần cuối:

protected $redirectTo = '/themes'; 

Đây là dòng đầu tiên trong tuyến đường của tôi/web.php:

Auth::routes(); 

Tôi đã thêm chức năng này trong Controller.php tôi:

public function __construct() 
    { 
     $this->middleware('auth'); 

    } 

tôi đã chỉnh sửa ứng dụng/Http/Middleware/RedirectIfAuthenticated.php, do đó xử lý chức năng trông như thế này:

public function handle($request, Closure $next, $guard = null) 
{ 
    if (Auth::guard($guard)->check()) { 
     return redirect('/themes'); 
    } 

    return $next($request); 
} 

Tất cả đều ổn, ngoại trừ khi tôi nhấp vào nút Đăng nhập, tôi được chuyển hướng đến "/", không phải "/ chủ đề". Nếu tôi không yêu cầu xác thực trong bộ điều khiển (không có hàm __contruct trong tệp Controller.php), tôi sẽ được chuyển hướng OK khi đăng nhập. Tôi đang làm gì sai?

Trả lời

18

Đó là những gì tôi đang làm việc, thật trùng hợp.

Bạn cũng cần phải thêm những dòng sau vào LoginController bạn

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

Tuyệt vời! Điều duy nhất là isAdmin() đã cho tôi một BadMethodCallException, vì vậy tôi bỏ qua toàn bộ phần IF và nó hoạt động hoàn hảo! – ivanacorovic

+1

Tôi vui vì nó đã giúp, ứng dụng của tôi sử dụng isAdmin() để kiểm tra người dùng là quản trị viên trước khi chuyển hướng, không thể thay đổi theo mã của bạn chỉ muốn đưa ra gợi ý cho bạn.Cảm ơn – Babagana

3

Con đường tôi đã thực hiện nó bằng cách sử dụng AuthenticatesUsers tính trạng.

\App\Http\Controllers\Auth\LoginController.php

Thêm phương pháp này để điều khiển rằng:

/** 
* 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

Nếu bạn nhìn vào AuthenticatesUsers tính trạng bạn sẽ thấy rằng trong phương pháp sendLoginResponse rằng có một cuộc gọi thực hiện để $this->redirectPath(). Nếu bạn nhìn vào phương thức này thì bạn sẽ khám phá ra rằng redirectTo có thể là một phương thức hoặc một biến.

Đây là những gì tôi hiện có trong bộ điều khiển auth của mình.

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

Chuyển hướng bằng cách sử dụng vai trò truy cập có thể được thực hiện theo cách này bằng cách sử dụng thư viện Bouncer (đối với những người không viết có phương pháp kiểm soát truy cập riêng). Chỉ cần thay đổi "case $ user-> isInstructor():" thành "case Bouncer :: allow ('isInstructor', $ user):". Bạn rõ ràng sẽ cần phải có khả năng 'isInstructor' được thêm vào vai trò người dùng. Nếu có ai muốn tôi đăng mã Bouncer mà tôi sử dụng trong bộ điều khiển thì hãy cho tôi biết. – AKMorris

0

Bạn nên đặt $ value redirectTo để định tuyến mà bạn muốn chuyển hướng

$this->redirectTo = route('dashboard'); 

bên AuthController constructor.

/** 
* 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'); 
} 
Các vấn đề liên quan