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 上寻找参考,我找到了一些参考,但这些对我没有帮助。谁能帮帮我谢谢。

我查过和试过的一些参考资料:

  1. https://laracasts.com/discuss/channels/laravel/redirect-intended-not-working-after-login?page=1
  2. Laravel 5 - redirect()->intended() after authentication not going to intended
  3. 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);
    }
}