场景
- 公司项目经常会要求,在一定时间内无操作 则自动退出登陆
- 环境
参考资料
分析
- 这个需要分析每一次请求,所以定义一次全局的middleware
解决
- session记录上次访问的时间, 比较和当前访问的时间戳是否达到了要求, 如果超过了限制 退出登陆状态 && 跳转到登陆页面
- 我是用了laravel echo服务 所以增加了一个属性,去屏蔽pusher路由
代码
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Log;
class SessionTimeout
{
private $key_session_last_active = 'last_active_time';
private $time_decay = 7200;
private $list_except_path = [
'broadcasting/auth'
];
public function handle($request, Closure $next)
{
$path = $request->path();
if (!auth()->check() || in_array($path, $this->list_except_path)) {
return $next($request);
}
if (session()->has($this->key_session_last_active)) {
$time_decay = time() - session($this->key_session_last_active);
if ($time_decay > $this->time_decay) {
$email = auth()->user()->email;
auth()->logout();
session()->forget($this->key_session_last_active);
flash('您好,系统监测到您2个小时未操作,请重新登陆!')->warning();
return redirect('login')->withInput(compact('email'));
}
}
if ($this->determineLogoutAction()){
session()->has($this->key_session_last_active) && session()->forget($this->key_session_last_active);
} else {
session()->put($this->key_session_last_active, time());
}
return $next($request);
}
private function determineLogoutAction(): bool
{
$route_name = request()->route()->getName();
return $route_name === 'logout';
}
}