Heim >Backend-Entwicklung >PHP-Tutorial >PHP用户登陆限制的实现

PHP用户登陆限制的实现

WBOY
WBOYOriginal
2016-06-20 12:31:561957Durchsuche

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

那么如何友好的限制用户账户登陆的呢?我们首先分析一下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));}
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP中Redis环境的配置【Windows10 Test】Nächster Artikel:php的ob缓存