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

PHP用户登陆限制的实现

Jun 20, 2016 pm 12:31 PM

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

那么如何友好的限制用户账户登陆的呢?我们首先分析一下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으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

11 최고의 PHP URL 쇼트너 스크립트 (무료 및 프리미엄) 11 최고의 PHP URL 쇼트너 스크립트 (무료 및 프리미엄) Mar 03, 2025 am 10:49 AM

11 최고의 PHP URL 쇼트너 스크립트 (무료 및 프리미엄)

Instagram API 소개 Instagram API 소개 Mar 02, 2025 am 09:32 AM

Instagram API 소개

Laravel의 플래시 세션 데이터로 작업합니다 Laravel의 플래시 세션 데이터로 작업합니다 Mar 12, 2025 pm 05:08 PM

Laravel의 플래시 세션 데이터로 작업합니다

Laravel Back End : Part 2, React가있는 React 앱 구축 Laravel Back End : Part 2, React가있는 React 앱 구축 Mar 04, 2025 am 09:33 AM

Laravel Back End : Part 2, React가있는 React 앱 구축

Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Mar 12, 2025 pm 05:09 PM

Laravel 테스트에서 단순화 된 HTTP 응답 조롱

PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 Mar 14, 2025 am 11:42 AM

PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법

Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Mar 13, 2025 pm 12:08 PM

Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트

라 라벨에서 알림 라 라벨에서 알림 Mar 04, 2025 am 09:22 AM

라 라벨에서 알림

See all articles