天天看点

单用户限制登录

在用户表增加两个字段,

  • is_login 记录登录状态,(0未登录,1已登录)
  • session_id 记录登录的session_id

控制器操作:

  • 正常退出: 更新 is_login为0
    • 非正常退出: 判断is_login, 若为
    • 0 则直接登录
    • 为1 且最近登录时间小于30分钟
    • 提示”该用户已经登录”,给出以下选项
      • 不登录返回首页
      • 短信验证->注销该用户所有SESSION->正常登录,
    • 为1 且最近登录时间大于30分钟
    • 正常登录,(更新session_id ,is_login =1)

原理图

单用户限制登录

如果用户退出后修改is_login的状态,但是问题的难点是用户进行非法退出,就无法修改is_login的状态,需要进行再一步的判断,即如果is_login为1的话不能直接提示“已经登录”,而是需要判断旧的session_id对应的session在服务器中是否存在,存在的话就提示“已经登录”,不存在就允许登录.

前端登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>单用户登录</title>
</head>
<body>
       <input type="text" id="user" value="admin">
       <input type="text" id="pwd" value="password">
       <button id='save'> Click Me</button>


<script src="./jquery.js"></script>
<script>
$(document).ready(function(){
    $('#save').click(function(){
        $.ajax({
            type:"POST",
            url:"./login.php",
            data:{"user":$("#user").val(),"pwd":$("#pwd").val()},
            dataType:"json",
            success:function(data){
                if(data.success){
                    alert(data.msg);
                }else{
                    alert(data.msg);
                }
            },
            error:function(jqXHR){
              alert('Error code'+jqXHR.status +'message:'+jqXHR.responseText);
            }
        });
    });
});
</script>
</body>
</html>
           

后台登陆页面

header("Content-type:text/html;charset=utf-8");
ini_set('display_errors',);
ini_set('display_startup_errors', );
error_reporting(E_ALL);

$user = "admin";
$pwd = "password";

//echo '{"success":false,"msg":'.json_encode($_POST).'}';
//echo '{"success":true,"msg":"Login success!"}';
//return;

    # 简单进行账号密码判断
    # 请根据现有框架进行数据处理和安全校验.这里略过
    if($_POST['user'] == $user && $_POST['pwd']== $pwd){
        # 跳过
    }else{
        echo '{"success":false,"msg":"账号密码错误"}';
        return;
    }

/* 
 * 正常登录操作
 */
function login(){
    // 执行正常登录操作和过滤操作
    $is_login = ;
    $_SESSION['session_id'] = base64_encode(time() +  );
}


$is_login = ;
session_start();

# 没登录过则更新session_id和登录状态is_login;
if($is_login == ){
    login();
}

# 上次有登录,没有正常登出操作
if($is_login == ){
    # 如果存在session,但是时间超时,则跳转登录
    if( isset( $_SESSION['session_id']) ){
        $str = $_SESSION['session_id'];
        if (time() < base64_decode($str)){
            echo '{"success":true,"msg":"已有在线用户登录"}';
            return;
        }else{
            # 距上次登录大于20分钟则直接登录
            login();
        }
    }
}


echo '{"success":true,"msg":"登录成功!且SESSION已设置为:'.$_SESSION["session_id"].'"}';
return;