Laravel redirect()->intended() 在自定义登录控制器中不起作用
Laravel redirect()->intended() is not working in custom login controller
我有一个自定义登录控制器,它使用 return redirect()->intended(route('home'))
,根据文档,这应该将用户重定向到他们在被身份验证拦截之前尝试访问的 URL中间件。
但对于我的情况,每次它都重定向到 home route
。我确信我做对了,或者至少我认为我做对了。谁能告诉我我哪里做错了??
我的logincontroller
是这样的:
public function __construct()
{
$this->middleware('guest');
}
public function login(Request $request)
{
$validatedData = $request->validate([
'email' => 'required|email|max:255',
'password' => 'required|max:255',
]);
try {
$response = HelperFunctions::fetchData('post', 'login/login', [
'loginId' => $request->get('email'),
'password' => md5($request->get('password'))
]);
if ($response['code'] == 200 && $response['success']) {
session([
'api_token' => $response['sessionId'],
'user_data' => $response['data']['profile']
]);
return redirect()->intended(route('home'));
} else {
return redirect()->back()->with('error', 'Please provide valid credentials');
}
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Opps!! Something is wrong. We are trying to fix it');
}
我的身份验证中间件
class checkAuthentication
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//check if user is logged in
if(Session::has('api_token') && Session::has('user_data')) {
return $next($request);
}
return redirect(route('login'));
}
}
我也试过 dd()
Session::get('url.intended')
但它 returns 是空的。
我确实尝试在 google、laracast 和 Whosebug 上寻找参考,我找到了一些参考,但这些对我没有帮助。谁能帮帮我谢谢。
我查过和试过的一些参考资料:
- https://laracasts.com/discuss/channels/laravel/redirect-intended-not-working-after-login?page=1
- Laravel 5 - redirect()->intended() after authentication not going to intended
- https://laravel.io/forum/11-24-2014-problems-with-redirectintended-and-auth
这样做:
return redirect()->intended('home');
而不是这个:
return redirect()->intended(route('home'));
最简单的方法是在您的 Auth
中间件中 redirect()->guest()
而不是您当前拥有的重定向:
return redirect()->guest(route('login'));
在重定向器上使用 guest()
方法是将 url.intended
值添加到会话的原因。
或者,如果中间件未通过身份验证,您可以抛出一个 AuthenticationException
:
而不是从中间件返回
public function handle($request, Closure $next)
{
//check if user is logged in
if(Session::has('api_token') && Session::has('user_data')) {
return $next($request);
}
throw new AuthenticationException('Unauthenticated.');
}
如果需要,这将使您能够利用 Laravel 的 ExceptionHandler
。您还需要将 use Illuminate\Auth\AuthenticationException;
添加到 class.
的顶部
I also tried to dd() Session::get('url.intended') but it returns empty .
就我而言,这个密钥存在于我的会话中,但由于某些奇怪的原因,在 redirect()->intended()
returns 重定向响应之后发生了一些有趣的事情。也许响应在传输过程中被丢弃,或者被堆栈上的其他调用者拦截。
我为解决这个问题所做的工作是从会话中手动获取预期的 url 并将其交给重定向(而不是依赖 intended()
的底层协议)。
通过添加这个
redirect(Session::get('url.intended', $this->redirectPath()));
在 LoginController@showLoginResponse
的底部,一旦用户通过身份验证,Laravel 能够记住预期的 url 并重定向到它
我也遇到过这个问题,我想出的最好方法是使用经过身份验证的方法。
因此覆盖控制器中的已验证方法并在那里使用预期的路由。
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
if ($user->role == 'admin') {
return redirect()->intended('/admin');
} elseif ($user->role == 'user') {
return redirect()->intended('/');
}
}
有时更改 RedirectIfAuthenticated 中间件也有帮助。
所以转到 App\Http\Middleware\RedirectIfAuthenticated.php 并编辑它。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
if ($request->user()->role == 'admin') {
return redirect()->intended('/admin');
} elseif ($request->user()->role == 'user') {
return redirect()->intended('/');
}
// return redirect('/home');
}
return $next($request);
}
}
我有一个自定义登录控制器,它使用 return redirect()->intended(route('home'))
,根据文档,这应该将用户重定向到他们在被身份验证拦截之前尝试访问的 URL中间件。
但对于我的情况,每次它都重定向到 home route
。我确信我做对了,或者至少我认为我做对了。谁能告诉我我哪里做错了??
我的logincontroller
是这样的:
public function __construct()
{
$this->middleware('guest');
}
public function login(Request $request)
{
$validatedData = $request->validate([
'email' => 'required|email|max:255',
'password' => 'required|max:255',
]);
try {
$response = HelperFunctions::fetchData('post', 'login/login', [
'loginId' => $request->get('email'),
'password' => md5($request->get('password'))
]);
if ($response['code'] == 200 && $response['success']) {
session([
'api_token' => $response['sessionId'],
'user_data' => $response['data']['profile']
]);
return redirect()->intended(route('home'));
} else {
return redirect()->back()->with('error', 'Please provide valid credentials');
}
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Opps!! Something is wrong. We are trying to fix it');
}
我的身份验证中间件
class checkAuthentication
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//check if user is logged in
if(Session::has('api_token') && Session::has('user_data')) {
return $next($request);
}
return redirect(route('login'));
}
}
我也试过 dd()
Session::get('url.intended')
但它 returns 是空的。
我确实尝试在 google、laracast 和 Whosebug 上寻找参考,我找到了一些参考,但这些对我没有帮助。谁能帮帮我谢谢。
我查过和试过的一些参考资料:
- https://laracasts.com/discuss/channels/laravel/redirect-intended-not-working-after-login?page=1
- Laravel 5 - redirect()->intended() after authentication not going to intended
- https://laravel.io/forum/11-24-2014-problems-with-redirectintended-and-auth
这样做:
return redirect()->intended('home');
而不是这个:
return redirect()->intended(route('home'));
最简单的方法是在您的 Auth
中间件中 redirect()->guest()
而不是您当前拥有的重定向:
return redirect()->guest(route('login'));
在重定向器上使用 guest()
方法是将 url.intended
值添加到会话的原因。
或者,如果中间件未通过身份验证,您可以抛出一个 AuthenticationException
:
public function handle($request, Closure $next)
{
//check if user is logged in
if(Session::has('api_token') && Session::has('user_data')) {
return $next($request);
}
throw new AuthenticationException('Unauthenticated.');
}
如果需要,这将使您能够利用 Laravel 的 ExceptionHandler
。您还需要将 use Illuminate\Auth\AuthenticationException;
添加到 class.
I also tried to dd() Session::get('url.intended') but it returns empty .
就我而言,这个密钥存在于我的会话中,但由于某些奇怪的原因,在 redirect()->intended()
returns 重定向响应之后发生了一些有趣的事情。也许响应在传输过程中被丢弃,或者被堆栈上的其他调用者拦截。
我为解决这个问题所做的工作是从会话中手动获取预期的 url 并将其交给重定向(而不是依赖 intended()
的底层协议)。
通过添加这个
redirect(Session::get('url.intended', $this->redirectPath()));
在 LoginController@showLoginResponse
的底部,一旦用户通过身份验证,Laravel 能够记住预期的 url 并重定向到它
我也遇到过这个问题,我想出的最好方法是使用经过身份验证的方法。
因此覆盖控制器中的已验证方法并在那里使用预期的路由。
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
if ($user->role == 'admin') {
return redirect()->intended('/admin');
} elseif ($user->role == 'user') {
return redirect()->intended('/');
}
}
有时更改 RedirectIfAuthenticated 中间件也有帮助。 所以转到 App\Http\Middleware\RedirectIfAuthenticated.php 并编辑它。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
if ($request->user()->role == 'admin') {
return redirect()->intended('/admin');
} elseif ($request->user()->role == 'user') {
return redirect()->intended('/');
}
// return redirect('/home');
}
return $next($request);
}
}