简单方法实现单点登陆
今天在做暑期项目时遇到一个问题,项目是个组队的项目。上面要求不能一个账号多人登陆在线,后面登陆的人要把前面的人顶掉,类似于王者荣耀之类的。一开始准备用框架,但是框架有些复杂,用在这个项目是感觉没有必要,所以采用一个简便的方法。
思路如下:在数据库中加入一个状态属性,这个状态是随机产生的六位数值。把这个数值储存到数据库,之后定义一个全局常量,把这个随机产生的六位数值赋值给这个常量。然后在每个网页加入常量与数据库中状态属性值的比较,如果不同就跳转到登陆界面。在其他地方登陆会产生新的六位数值,这样就和常量不一样,那前面登陆的也就被挤下去了。
1. 创建数据库
我用的是MySQL数据库,创建一个如下的表。
2. 连接数据库
这里我只是实现简单连接,功能逻辑不完善。
<?php
#数据库连接工具
$conn = new mysqli("localhost", "root", "root", "hrsystemdb");
?>
3. 简单搭一个登陆界面和主页
//登陆界面
<html>
<head>
<meta charset="utf-8">
<title>登陆</title>
</head>
<body>
<form action="userLoginAction.php" method="POST">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登陆"></td>
</tr>
</table>
</form>
</body>
</html>
----------------------------------------------------------------------------------------
//主页
<?php
#链接数据库
include 'MySqlConnect.php';
//开启回话:登陆验证
include 'stateAction.php';
//include 'stateAction.php';
if (!isset($username)) {
//没有用户要返回登陆界面
header("location:userLogin.php");
}
//$sql1 = "select Astate from tb_admin where Aname='$username' ";
//$result1 = $conn->query($sql1);
//$nums = mysqli_fetch_array($result1);
//if($nums[0]!=$zhuangtai) {
// header("location:userLogin.php");
//}
$sql = "select * from tb_emp,tb_dept where tb_emp.Edeptno=tb_dept.Dno";
$result = $conn->query($sql);
echo "<table border='1' width='600' align='center'>";
echo "<caption>欢迎来到员工管理系统V1.0</caption>";
echo "<tr><th>工号</th><th>姓名</th><th>年龄</th><th>部门</th><th>操作1</th><th>操作2</th></tr>";
while ($row = mysqli_fetch_array($result)) {
echo "<tr>";
echo "<th>" . $row['Eno'] . "</td>";
echo "<th>" . $row['Ename'] . "</td>";
echo "<th>" . $row['Eage'] . "</td>";
echo "<th>" . $row['Dname']. "</td>";
echo "<td><a href='empModify.php?empNo=$row[Eno]'>修改</td>";
echo "<td><a href='empDelAction.php?empNo=$row[Eno]'>删除</td>";
echo "</tr>";
}
echo "<tr><td clospan='6'><a href='empAdd.php'>添加</a></td></tr>";
echo "</table>";
echo "<a href='userLoginOutAction.php'>退出</a>";
mysqli_free_result($result);
?>
4. 登陆功能实现
<?php
include 'MySqlConnect.php';
#登陆处理页面 获取用户名和密码
# 1-获取数据
$username = $_POST["username"];
$password = $_POST["password"];
# 开启session_start
session_start();
# 链接数据库
#$conn=new mysqli("localhost","root","root","hrsystemdb");
$sql = "select * from tb_admin where Aname='$username' and Apassword='$password' ";
$result = $conn->query($sql);
#返回结果集的数量。当返回数量>=1时,表明数据库数据至少有一条满足要求
$nums = mysqli_num_rows($result);
# 2-数据判断
if ($nums > 0) {
$randStr=str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890');
$rand=substr($randStr,0,6);
// echo $rand;
$sql2 = "update tb_admin set Astate='$rand' where Aname='$username' and Apassword='$password' ";
$result2 = $conn->query($sql2);
// echo ZHUANGTAI;
header("location:empList.php?zhuangtai=$rand");
$_SESSION["username"] = $username;
} else {
header("location:userLogin.php");
}
#关闭数据库连接
mysqli_free_result($result);
?>
5. 单点功能实现
要是有其他页面,只要直接引入这个文件名就可以。
<?php
session_start();
$username = $_SESSION["username"];
$zhuangtai=$_GET["zhuangtai"];
$sql1 = "select Astate from tb_admin where Aname='$username' ";
$result1 = $conn->query($sql1);
$nums = mysqli_fetch_array($result1);
if($nums[0]!=$zhuangtai) {
header("location:userLogin.php");
}
?>
注:(这是我的文件格式)
6. 测试
在IE上登陆效果图
进入主页
在谷歌上登陆后,进入主页
刷新IE浏览器后
被挤了下来。
以上就简单的实现了单点登陆的功能。
最好再加入后台定时刷新,当然这并不是真的单点登陆,有专门的框架可以使用,但是框架较为复杂。
以上内容仅供参考