php sessionid 重复,php_ session_id 限制同一用户同时登录
发布日期:2021-10-31 15:52:23 浏览次数:3 分类:技术文章

本文共 2096 字,大约阅读时间需要 6 分钟。

出于信息安全的考虑,希望给每个能进入系统的人员一个账户,而不是所有人共用一个账户,并且一个账户同时只能一人登陆。刚开始的做法是登陆加锁,当用户登陆之后,对此用户进行标记,若此用户未下线状态下进行第二次登陆尝试,则禁止其登陆。这样做就解决了单账户多用户同时登陆的问题,但是实际操作中,却遇到了更大的问题:用户登陆过程中对其进行了加锁,则用户离开时就必须要进行解锁操作,而很多用户离开网站的习惯是直接点击浏览器的关闭按钮,这就导致无法解锁,最终导致用户正常登陆也受到限制。

那么如何友好的限制用户账户登陆的呢?我们首先分析一下PHP是如何识别用户是否登陆的。由于HTTP协议无状态性的特点,我们无法通过它对用户进行识别。一般来说,对用户的识别主要通过cookie或session,它们之前最大的不同是cookie数据由客户端存储,每次向服务端发送请求时,客户端把有效的cookie随请求发送到服务端,而session数据由服务端存储,服务端可以根据客户端发送的特定cookie值来判定这些请求是否属于同一请求。我们这样对用户进行登陆检测:public function login(Request $request)

{

$dl = $request ->input('dl','');

$password = $request -> input('password','');

if($dl == ''){

return redirect('/')->with('danger','登录帐号或密码错误!');

}

if($password == ''){

return redirect('/')->with('danger','登录帐号或密码错误!');

}

$userinfo = User::where('dl',$dl)->first();

// 判断用户帐号是否存在

if(empty($userinfo)){

return redirect('/')->with('danger','您输入的帐号不存在!');

}

// 判断密码是否正确

if(md5($password) != $userinfo['password']){

return redirect('/')->with('danger','登录帐号或密码错误!');

}

return redirect('/userinfo');

}

显而易见,上面的代码并不能实现我们想要的效果。想要达到我们想要的效果,我们只需要在上面代码基础上,再加一层session_id的验证就可以了。用户在登录时储本次会话的session id,当用户再次登录时,首先删除之前用户的session id,再把本次登陆的session id保存起来,这样一来,原来的用户就会被新用户挤下线。public function login(Request $request)

{

$dl = $request ->input('dl','');

$password = $request -> input('password','');

if($dl == ''){

return redirect('/')->with('danger','登录帐号或密码错误!');

}

if($password == ''){

return redirect('/')->with('danger','登录帐号或密码错误!');

}

$userinfo = User::where('dl',$dl)->first();

// 判断用户帐号是否存在

if(empty($userinfo)){

return redirect('/')->with('danger','您输入的帐号不存在!');

}

// 判断密码是否正确

if(md5($password) != $userinfo['password']){

return redirect('/')->with('danger','登录帐号或密码错误!');

}

//用户登陆限制

$session_id = Session::getId();

if($userinfo['session_id'] != $session_id){

//  session_id 其实就是 session 文件名,当然我是以 Laravel 框架为例,不同框架可能不一样。

empty($userinfo['session_id']) ? '' : unlink(storage_path().'/framework/sessions/'.$userinfo['session_id']) ;

Cache::put('login_error', '您的帐号在异地登录,非本人操作请及时修改密码。', 3);

User::where('uid',$userinfo['uid'])->update(['session_id'=>$session_id]);

}

return redirect('/userinfo');

}

转载地址:https://blog.csdn.net/weixin_39987847/article/details/115884290 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:php 按钮的属性值,HTML button标签的属性有哪些
下一篇:使用matlab内存不足,Matlab内存不足问题(Out of memory)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月16日 21时05分39秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章