首页 > 解决方案 > 防止同时登录用户和自定义守卫

问题描述

我正在为不同类型的用户使用自定义保护,使用标记为 的自定义保护business_user

我注意到我能够以普通用户(网络)和我的business_users. 我已经阅读了Pusher 文档,该文档首先用于创建自定义防护,以将其他中间件添加到我的“LoginController”中。

但实际上我什至没有 LoginController,我为每种用户类型创建了自己的控制器。AuthController(用于 Web)和 BusinessController(用于 business_user)。

我使用以下代码创建了第三个标有 LoginController 的控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{

    use AuthenticatesUsers;

    protected $redirectTo = '/dashboard';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
        $this->middleware('guest:business_user')->except('logout');
    }
}

我还更新了我RedirectIfAuthenticated的如下:

class RedirectIfAuthenticated
{

    public function handle($request, Closure $next, $guard = null)
    {
        if ($guard == "business_user" && Auth::guard($guard)->check()) {
            return redirect('/dashboard');
        }
        if (Auth::guard($guard)->check()) {
            return redirect(RouteServiceProvider::HOME);
        }

        return $next($request);
    }

RedirectIfAuthenticated我的中间件文件夹中也有一个中间件。

<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
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 ($guard == "business_user" && Auth::guard($guard)->check()) {
            return redirect('/dashboard');
        }
        if (Auth::guard($guard)->check()) {
            return redirect(RouteServiceProvider::HOME);
        }

        return $next($request);
    }
}

当我登陆我的用户登录页面时,它仍然允许我尝试登录。有人可以告诉我如何解决这个问题吗?

标签: laravel

解决方案


我认为是因为中间件的顺序

<?php

public function __construct()
    {
        $this->middleware('guest')->except('logout'); // this procress first and redirect to login page
        $this->middleware('guest:business_user')->except('logout');
    }

所以,我认为您可以直接签入__construct()LoginController登录视图(blade文件)

@if (Auth::check('business_user'))
    You are already logged in (or perform a redirect somewhere)
@else
    //display login form
@endif 

推荐阅读