改造laravel的登录流程,仅使用一个token登录laravel

时间:2023-03-08 22:10:51
改造laravel的登录流程,仅使用一个token登录laravel

背景:最近使用lavavel来改造目前的系统,但是之前的老系统还不能立马下线,这时就出现了双系统共存的状态,需要解决的一个问题就是一次登录2个系统。

第一步

修改中间件App\Http\Middleware\Authenticate(红色部分为新增的内容)

public function handle($request, Closure $next, $guard = null)
    {
        if($request->has("iToken"))
        {
            $this->login($request);

            $request->query->remove("iToken");
        }
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('login');
            }
        }
        return $next($request);
    }

意思就是说如果参数里存在iToken,则调用login登录,登录之后从参数里移除iToken,接下来改造login

1.修改trait Illuminate\Foundation\Auth\AuthenticatesUsers的validateLogin和参数获取方法方法,屏蔽用户名和密码的必要性检测

protected function validateLogin(Request $request)
    {
        if(!$request->has("iToken"))
        {
            $this->validate($request, [
                $this->loginUsername() => 'required', 'password' => 'required',
            ]);
        }
    }
protected function getCredentials(Request $request)
    {
        if(!$request->has("iToken"))
        {
            return $request->only($this->loginUsername(), 'password');
        }
        else
        {
            return $request->only("iToken");
        }
    }

2.修改最终查找用户的方法Illuminate\Auth\EloquentUserProvider类的retrieveByCredentials

public function retrieveByCredentials(array $credentials)
    {
        if (empty($credentials)) {
            return;
        }

        // First we will add each credential element to the query as a where clause.
        // Then we can execute the query and, if we found a user, return it in a
        // Eloquent User "model" that will be utilized by the Guard instances.
        $query = $this->createModel()->newQuery();

        if(!isset($credentials['iToken']))
        {
            foreach ($credentials as $key => $value) {
                if (! Str::contains($key, 'password')) {
                    $query->where($key, $value);
                }
            }
        }
        else
        {
            $query->where("iToken", $credentials['iToken']);
        }
        return $query->first();
    }

现在就可以在url后面最近iToken参数来自动登录了,至于iToken的管理就是另外的事情了