laravel 单用户登录

单用户登录

原理:

1.在登录时,生成一个加密字符串,写入cookie
2.生成一个特征字符串key,当前时间为value.写入redis
3.比对

1.在LoginController的login方法中增加代码

# 原来代码如下
 if ($this->attemptLogin($request)) {
    return $this->sendLoginResponse($request)
 }

 # 更改后的代码
  if ($this->attemptLogin($request)) {
  $time = time();
  // md5 加密
  $singleToken = md5(request()->getClientIp() . auth()->id() . $time);
  // 当前 time 存入 Redis
  Redis::set('laravel:single_user_login_' . auth()->id(), $time);
  // 跳转到首页, 并附带 Cookie
  return $this->sendLoginResponse($request)->withCookie('SINGLE_USER_LOGIN',$singleToken);
}

2.生成中间件

$ php artisan make:middleware SingleUserLogin

3.修改中间件hand方法代码

public function handle($request, Closure $next)
{
        // 获取单用户登录cookie
        $cookieSignToken = request()->cookie('SINGLE_USER_LOGIN');
        if(!$cookieSignToken) {
            auth()->logout();
            return redirect('/login');
        }
        // 得到redis中的key
        $key = 'laravel:single_user_login_' . auth()->id();
        if(Redis::exists($key)){
            // 取出登录时存入的时间戳
            $signTime = Redis::get($key);
            $signToken = md5(request()->getClientIp() . auth()->id() . $signTime);
            // 重新加密并且判断是否和cookie值相等,如果不等,就退出登录,跳转到登录页面
            if($signToken !== $cookieSignToken) {
                auth()->logout();
                return redirect('/login');
            }
            return $next($request);
        }else{
            auth()->logout();
            return redirect('/login');
        }
 }

4.添加中间件

修改Kernel.php

protected $routeMiddleware = [
........
'single.user.login'=>\App\Http\Middleware\SingleUserLogin::class
];

5.在要使用单用户登录的控制器__construct中调用

$this->middleware('single.user.login')->only(['store','create','edit','update']);