背景:最近使用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的管理就是另外的事情了
时间: 2024-08-27 21:39:17