防止同时登录用户和自定义防护

时间:2020-06-22 23:58:19

标签: laravel

我正在使用标记为business_user的自定义防护为其他类型的用户使用自定义防护。

我注意到我能够以普通用户(web)和我的business_users身份登录。 我已经读过Pusher documentation,我曾经用它来创建自定义防护,以便在“ 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);
    }
}

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

2 个答案:

答案 0 :(得分:0)

在LoginController中,您可以覆盖authenticated方法。


/**
  * The user has been authenticated.
  *
  * @param  \Illuminate\Http\Request  $request
  * @param  mixed  $user
  * @return mixed
*/
protected function authenticated(Request $request, $user)
{
   auth()->login($user); // this method will login with default guard
   return redirect()->intended($this->redirectPath()); 
}

答案 1 :(得分:0)

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

<?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()的{​​{1}}或登录视图(LoginController文件)中进行检查

blade