Laravel 5.4 登录后重定向到自定义 url

Posted

技术标签:

【中文标题】Laravel 5.4 登录后重定向到自定义 url【英文标题】:Laravel 5.4 redirection to custom url after login 【发布时间】:2017-06-29 20:15:32 【问题描述】:

我使用的是 Laravel Framework 5.4.10,并且我使用的是常规身份验证

php artisan make:auth

提供。我想保护整个应用程序,并在登录后将用户重定向到 /themes。

我有 4 个控制器:ForgotPasswordController.php、LoginController.php、RegisterController.php 和 ResetPasswordController.php。我已将此行编辑为最后三行:

protected $redirectTo = '/themes';

这是我的 routes/web.php 中的第一行:

Auth::routes();

我已经在我的 Controller.php 中添加了这个函数:

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

    

我已经编辑了app/Http/Middleware/RedirectIfAuthenticated.php,使得handle函数看起来像这样:

public function handle($request, Closure $next, $guard = null)

    if (Auth::guard($guard)->check()) 
        return redirect('/themes');
    

    return $next($request);

一切都很好,除了当我点击登录按钮时,我被重定向到“/”,而不是“/themes”。如果我不需要控制器中的身份验证(Controller.php 文件中没有 __contruct 函数),我会在登录时重定向 OK。我究竟做错了什么?

【问题讨论】:

laracasts.com/discuss/channels/general-discussion/… 【参考方案1】:

这就是我目前的工作,真是巧合。

您还需要将以下行添加到您的 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 magic 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']);


【讨论】:

太棒了!唯一的问题是 isAdmin() 给了我一个 BadMethodCallException,所以我跳过了整个 IF 部分,它运行良好! 我很高兴它有所帮助,我的应用程序使用 isAdmin() 在重定向之前检查用户是否是管理员,不能有机会根据您的代码进行更改,只是想给您一个提示。谢谢 嗯,难道不能用 Auth 门面来获取经过身份验证的用户吗?用use Auth; 导入它,然后获取你会做的用户$user = Auth::user();【参考方案2】:

如果您查看 AuthenticatesUsers 特征,您会看到在 sendLoginResponse 方法中调用了 $this->redirectPath()。如果你看一下这个方法,你会发现redirectTo既可以是一个方法,也可以是一个变量。

这就是我现在的身份验证控制器中的内容。

public function redirectTo() 
    $user = Auth::user();
    switch(true) 
        case $user->isInstructor():
            return '/instructor';
        case $user->isAdmin():
        case $user->isSuperAdmin():
            return '/admin';
        default:
            return '/account';
    

【讨论】:

使用访问角色重定向也可以使用 Bouncer 库以这种方式完成(对于那些没有编写自己的访问控制方法的人)。只需将“case $user->isInstructor():”更改为“case Bouncer::allows('isInstructor', $user):”。您显然需要将“isInstructor”能力添加到用户角色中。如果有人想让我发布我在控制器中使用的 Bouncer 代码,请告诉我。 这样干净多了。你太棒了! Laravel 已经定义了 isAdmin() 等方法还是必须定义它们? @MasonH.Hatfield 您必须为您的应用程序定义它们。您还可以使用其他方法来处理此问题,例如 AKMorris 对Bouncer 的上述评论。【参考方案3】:

我使用 AuthenticatesUsers trait 的方式。

\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');

【讨论】:

如果我只想在用户通过网络而不是 api jwt 进行身份验证时重定向它怎么办?【参考方案4】:

对于较新版本的 Laravel,请将 protected $redirectTo = RouteServiceProvider::HOME; 替换为 protected $redirectTo = '/newurl'; 并相应地替换 newurl

使用 Laravel 版本 6 测试

【讨论】:

【参考方案5】:

Path Customization(在 laravel 7 中测试) 当用户成功通过身份验证时,他们将被重定向到/home URI。您可以使用 RouteServiceProvider 中定义的 HOME 常量自定义身份验证后重定向路径:

public const HOME = '/home';

【讨论】:

【参考方案6】:

您应该将 $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');

【讨论】:

【参考方案7】:

    转到Providers->RouteServiceProvider.php

    那里改变路线,如下所示:

    class RouteServiceProvider extends ServiceProvider
    
     protected $namespace = 'App\Http\Controllers';
    
     /**
      * The path to the "home" route for your application.
      *
      * @var string
      */
     public const HOME = '/dashboard';
    

【讨论】:

【参考方案8】:

您可以在 LoginController 中添加方法,在顶部添加行 use App\User;,在此添加方法之后,它对我有用 wkwkwkwkw,但您必须在视图管理员和用户上添加 csrf_field()

protected function authenticated(Request $request, $user)

$user=User::where('email',$request->input('email'))->pluck('jabatan');
$c=" ".$user." ";
$a=strcmp($c,' ["admin"] ');

if ($a==0) 
    return redirect('admin');

else
    return redirect('user');


【讨论】:

【参考方案9】:

按照Laravel documentation,我在app/Http/Controllers/Auth/LoginController.php中创建如下方法:

protected function redirectTo()

    $user=Auth::user();

    if($user->account_type == 1)
        return '/admin';
    else
        return '/home';
    


为了从我的数据库中获取用户信息,我使用了“Illuminate\Support\Facades\Auth;”。

【讨论】:

以上是关于Laravel 5.4 登录后重定向到自定义 url的主要内容,如果未能解决你的问题,请参考以下文章

登录 NEXT-AUTH 后重定向到自定义 URL

Laravel 8 Jetstream如何在重置密码后将用户重定向到自定义路由

Laravel Ajax登录,成功后重定向到上一个url

php [Incsub支持] - 在新票提交后重定向到自定义感谢页面。

Laravel - 登录后重定向回登录页面

在 Laravel 中登录多个角色后重定向