需要避免多人使用同样一个会员账号登录网站是一个重要的技术防护手段,掌握了基础的 HTTP 协议之后,很多问题的解决方案很容易就可以推导出来,不管是限制用户登录、跨站登录、还是超时自动登出都可以轻松的找到解决方案
单人登录可以更好的保护用户和网站的账户安全
好处: 1、保护用户利益,当用户的用户名和密码泄露后,用户可以得到提示你的账号已经在其他地方登录,请注意你的账户安全 2、保护网站利益,避免很多人使用同一个账户登录网站获取网站的服务
不要太把执行效率当回事,数据沉淀会带来长远的价值
当用户登录后就会创建用户相关的session信息,通过控制这些session信息,当有另一个用户登录后就将之前的session信息清除掉或者无效状态,这样客户端的cookie信息与服务器的session信息就无法进行匹配,用户就会处于非登录的状态。 方式: 1、删除之前的session信息(这种方式并不能很好的分析用户信息,不推荐) 2、修改之前的session信息(推荐)
session默认使用文件作为驱动,推荐使用database作为驱动,能持久化数据和对数据进行分析 在laravel中可以通过修改.env文件修改session驱动
php artisan session:table
php artisan migrate
生成mirgrate文件说明
Schema::create('sessions', function ($table) {
$table->string('id')->unique();
$table->unsignedInteger('user_id')->nullable();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity');
});
单人登录最简单粗暴的实现方式
可以看到登录的用户session和未登录的session信息 要想让之前登录的用户处于非登录的状态,就需要在后一个用户登录的时候,将之前的session信息进行删除
在app/Http/Controllers/Auth/LoginController.php控制器中重写AuthenticatesUsers的authenticated方法
protected function authenticated(Request $request, $user)
{
DB::table('sessions')->where('user_id',$user->id)->delete();
}
可以辅助我们防护网站保护用户账户的实现方式
上文中删除用户session信息实现的登录功能,并不能很好对用户session信息进行分析 采用对session信息进行修改,使其变成无效的session
通过修改sessions表id,在登录时将旧的id修改,让浏览器找不到这条session信息后便可退出之前的登录,为新登录重新分配一个session数据,对沉淀的旧session信息用于日后的数据分析
protected function authenticated(Request $request, $user)
{
DB::table('sessions')->where('user_id', $user->id)->orderBy('last_activity')->each(function ($session) {
DB::table('sessions')->where('id', $session->id)->update([
'id' => 'OUTMAN_' . $session->id
]);
});
}
建websocket服务器,为网站添加实时通信的能力(后期完善这块知识点)
当有人登录网站后会为用户发送一个实时消息,这样便可以知道账户被别人窃取,并且登录到了系统当中
|