Laravel-重定向经过身份验证的用户

时间:2018-11-22 18:00:07

标签: php laravel

在我的Laravel应用程序中,我有一个注册系统,该系统使用通过php artisan make:auth创建的默认支架来注册新用户,但是登录后,我希望将用户带到另一个名为member-type的页面,以便他们可以选择想要成为哪种类型的成员。

我利用protected function authenticated(Request $request, $user)中的AuthenticatesUsers来检查用户是否已成功登录,然后检查是否设置了成员类型。

方法如下:

/**
 * The user has been authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    Log::info("{$user->log_reference} logged in to their account with IP: {$request->getClientIp()}");

    if(!$user->investor_type_selected){
        // dd('I NOT SELECTED');
        return redirect()->route('user.investor-type');
    } elseif(!$user->member_type_selected){
        dd('M NOT SELECTED');
        return redirect()->route('user.member-type');
    } else{
        dd('BOTH SELECTED');
        return redirect()->route('user.dashboard');
    }
}

member_type_selected and investor_type_selected come from my用户模型的方法如下:

/**
 * Check whether this user has selected an investor type
 */
public function getInvestorTypeSelectedAttribute()
{
    return !empty($this->investor_type) ? true : false;
}

/**
 * Check whether this user has selected an investor type
 */
public function getMemberTypeSelectedAttribute()
{
    return !empty($this->member_type) ? true : false;
}

非常简单的东西。

转储和死亡在那里测试语句是否正在执行。

无论如何,我遇到的问题是中间件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)
{
    switch ($guard) {
        case 'admin':
            if (Auth::guard($guard)->check()) {
                return redirect()->route('admin.dashboard');
            }
            break;
        default:
            if (Auth::guard($guard)->check()) {
                return redirect()->route('user.dashboard');
            }
            break;
    }
    return $next($request);
}

现在,一旦用户通过身份验证,它就会启动并绕过使用authenticated进行的重定向。通常,我需要此中间件来确保用户返回其仪表板,但是有什么方法可以防止这种情况绕过我的重定向?

1 个答案:

答案 0 :(得分:1)

无需覆盖authenticated函数,请在您的RedirectIfAuthenticated中间件中进行尝试

public function handle($request, Closure $next, $guard = null)
{
    switch ($guard) {
        case 'admin':
            if (Auth::guard($guard)->check()) {
                return redirect()->route('admin.dashboard');
            }
            break;
        default:
            if (Auth::guard($guard)->check()) {
               $user = Auth::guard($guard)->user();
                 if(!$user->investor_type_selected){
                  return redirect()->route('user.investor-type');
                } elseif(!$user->member_type_selected){
                  return redirect()->route('user.member-type');
                } else{
                  return redirect()->route('user.dashboard');
                }
            }
            break;
    }
    return $next($request);
}