>백엔드 개발 >PHP 튜토리얼 >PHP用户登陆限制的实现

PHP用户登陆限制的实现

WBOY
WBOY원래의
2016-06-20 12:31:561954검색

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

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

<?phpsession_start();if(isset($_SESSION['login']) && $_SESSION['login'] == true){    echo "登陆成功!";}if(isset($_POST['uname']) && isset($_POST['password'])){$uname = $_POST['uname'];$pass = $_POST['password'];if($uname == "admin" && $pass == "admin"){    $_SESSION['login'] = true;    echo "登陆成功!";}else{    echo "用户名或密码错误!";}}?><form action="" method="post"><input type="text" name="uname"><input type="password" name="password"><input type="submit"></form>

显而易见,上面的代码并不能保证单用户只能同时登陆一次。第一种单账户登陆限制的办法是登陆时存储本次回话的session id,当用户登陆时,首先删除之前用户的session id,再把本次登陆的session保存起来,这样一来,原来的用户就会被新用户挤下线:

<?phpdefine("session_path",dirname(__FILE__)."/session");  //设置session存放的目录session_save_path(session_path);session_start();if(isset($_SESSION['login']) && $_SESSION['login'] == true){    echo "登陆成功!";}if(isset($_POST['uname']) && isset($_POST['password'])){    $uname = $_POST['uname'];    $pass = $_POST['password'];    if($uname == "admin" && $pass == "admin"){        $_SESSION['login'] = true;        kick_user();        echo "登陆成功!";    }else{        echo "用户名或密码错误!";    }}function kick_user(){    $last_login_session_id = file_get_contents("loginsession.txt");//获取上次登陆的session id,实际项目中最好存放在数据库中    $last_login_session_file = session_path."/sess_".$last_login_session_id;//获取session文件名    if(session_id()!= $last_login_session_id){        unlink($last_login_session_file);        file_put_contents("loginsession.txt",session_id());    }}?><form action="" method="post"><input type="text" name="uname"><input type="password" name="password"><input type="submit"></form>

在这个基础上,我们可以对单用户同时登陆的次数进行限制,只需更改kick_user函数如下:

function kick_user($num=1){    $last_login_session_id_file =  file_get_contents("loginsession.txt");    //获取上次登陆的session id    $last_login_session_id_arr = explode("|",$last_login_session_id_file);    if(!in_array(session_id(),$last_login_session_id_arr)){            array_push($last_login_session_id_arr,session_id());    }   if(count($last_login_session_id_arr) > $num) {        $rmsession = array_shift($last_login_session_id_arr);    }        if(isset($rmsession)){unlink(session_path."/sess_".$rmsession);}        file_put_contents("loginsession.txt",implode("|",$last_login_session_id_arr));}
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.