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的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 8 Jetstream如何在重置密码后将用户重定向到自定义路由