柔晶美网络工作室

柔晶美网络工作室,倾心于web技术的博客站点

关注我 微信公众号

您现在的位置是: 首页 > 博客日记

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');
	}

登录和退出跳转修改完成。

文章评论


需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!