Laravel6.*重写原登录,修改登录跳转和退出跳转地址
2019-12-15 admin laravel 1868
一个laravel6.*项目使用了自带的登录验证,重写了登录界面,并使用了第三方登录。现需求:无论是自带的账号密码登录,还是第三方登录,都需要在登录成功后跳转到登录前页面,比如购物页面。
经分析自带的登录流程vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php文件,发现验证成功后会调用 sendLoginResponse() 方法返回响应:
protected function sendLoginResponse(Request $request) { $request->session()->regenerate(); $this->clearLoginAttempts($request); return $this->authenticated($request, $this->guard()->user()) ?: redirect()->intended($this->redirectPath()); }
在该方法最后的 return 中可以看到:如果 authenticated() 方法返回值不为真,则执行 redirect()->intended() 方法。而 authenticated() 方法默认为空,所以必然会执行 redirect()->intended() 方法:
public function intended($default = '/', $status = 302, $headers = [], $secure = null) { $path = $this->session->pull('url.intended', $default); return $this->to($path, $status, $headers, $secure); }
在重定向的 intended() 方法中会检查 Seesion url.intended 键的值。如果有值,就会跳转到该地址,也就是访问但被 Auth 中间件拦截的那个页面。总结流程如下:
访问需要认证的页面 -> 被 Auth 中间件拦截后抛出异常 -> 处理异常:在 Session 中存入要访问的页面地址,然后跳转至登录页面 -> 登录成功后从 Session 中取出先前存入的页面地址,并跳转至该地址。
弄清楚了原理,修改就简单了。
修改文件:app/Http/Controllers/Auth/LoginController.php,重写方法:
namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Foundation\Auth\AuthenticatesUsers; use URL; class LoginController extends Controller { //use AuthenticatesUsers; //重写退出登录逻辑 use AuthenticatesUsers { logout as performLogout; } //登录前记录上一网址以便登录后跳转 public function showLoginForm() { $url = URL::previous(); session(['url.intended'=>$url]);//普通登录跳转https://www.cnblogs.com/xcxc/p/11219915.html session(['lasturl' => $url]);//第三方登录跳转,存储来源网址lasturl到session return view('auth.login'); } /** * Where to redirect users after login. * * @var string */ protected $redirectTo = '/'; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest')->except('logout'); } //退出登录跳转路径修改 public function logout(Request $request) { $this->performLogout($request); return redirect()->intended(); //return redirect()->route('index'); } }
第三方登录跳转修改,以微信登录为例:
//登录 Auth::login($check); session()->flash('success', '微信登录成功!'); $url = session('lasturl');//从session中获取登录前的url session()->forget('lasturl'); if($url){ return redirect($url); }else{ return redirect()->route('cxsy'); }
登录和退出跳转修改完成。