阅读前请先下载项目源码,边读边看源码以加深理解和实操,
源码地址已放于文章末尾!
第2篇:“芝麻开门!”——揭秘云盘的“门禁系统”
欢迎回来,各位“云盘建筑师”!


在上一篇中,我们已经搭好了“施工脚手架”,成功让我们的云盘项目在本地跑了起来。现在,我们的“云盘大厦”有了一个漂亮的入口,但问题是——这个入口谁都能进,简直就像个“公共厕所”,毫无隐私可言!
这可不行。我们的私人云盘,必须得有个靠谱的“门禁系统”,只有手持“钥匙”的主人才能进入。今天,我们就来扮演一回“金牌保镖”,为我们的云盘打造一套坚不可摧的用户认证系统!
核心探秘:PHP Session 是如何发放“临时通行证”的?
想象一下,你的云盘是一个守备森严的私人城堡。当你想进去时,不能直接闯,得先去门口的岗亭(登录页面)报上你的“暗号”(用户名和密码)。
岗亭里的守卫(服务器)会核对你的暗号。如果暗号正确,他不会把城堡的主钥匙给你(这太危险了!),而是会给你一张**“临时通行证”**,并告诉你:“嘿,拿着这个,今天你在城堡里可以畅通无阻了!”
同时,守卫自己也会在一个小本本上记下:“通行证编号007,发给了张三,有效。”
这张“临时通行证”,在我们的技术世界里,就是 PHP Session。
当你拿到通行证后,无论你是想去城堡的“书房”(查看文件),还是想去“后花园”(上传文件),每个关卡的守卫都会检查你的通行证。他们只需在自己的小本本上查一下这个编号是否有效,就知道该不该放行了。
等你离开城堡(关闭浏览器),这张通行证就会自动失效。下次再来?不好意思,请重新报暗号领证。
这个过程,我用一张时序图给你描绘出来,保证一清二楚:
看明白了吗?Session 机制的核心,就是通过一个独一无二的ID来跟踪用户的登录状态,避免了每次请求都得重新输入密码的尴尬。
代码实战:“四位一体”深扒登录逻辑
好了,理论学习结束,是时候亮出我们的“手术刀”,解剖代码了!咱们的门禁系统,主要由 login.php、config.php 和 index.php 这三位同志协同完成。
1. “后勤部长”的秘密武器 - config.php
这里存放着我们最核心的“暗号”。
a. 文件路径定位: config.php
b. 全面讲解引用:
define(): 这是PHP中用来定义一个常量的函数。常量一旦定义,就不能被改变。把账号密码这种重要信息定义为常量,可以防止在代码的其他地方被意外修改。password_hash(): 这是PHP官方推荐的密码加密函数。它会使用一种强单向哈希算法来加密你的密码。PASSWORD_DEFAULT表示使用当前PHP版本最推荐的算法,非常安全。
c. 逐行注释与结构化分析:
// 文件路径: config.php
<?php
// ...
// 定义系统配置常量
define('USERNAME', 'admin'); // 用户名
// 使用 password_hash 对密码进行加密,增强安全性
define('PASSWORD_HASH', password_hash('admin', PASSWORD_DEFAULT)); // 默认密码:admin
define('UPLOAD_DIR', __DIR__ . '/uploads'); // 上传目录
// ...
?>
逻辑拆解:
这段代码非常直白。它定义了三个系统级别的“铁律”:用户名是admin,密码是admin加密后的那一长串神秘代码,文件仓库在uploads文件夹。最关键的是 password_hash(),它不是简单的把’admin’变成’nimda’,而是生成一个几乎无法逆向破解的字符串。这意味着,即使数据库被盗,黑客也无法知道你的原始密码是什么。安全感,瞬间爆棚!
2. “门卫岗亭”的职责 - login.php
这是用户唯一能看到的认证界面,一个纯粹的“门面担当”。
a. 文件路径定位: login.php
b. 全面讲解引用:
$_POST: PHP中的一个超全局变量,专门用来收集method="post"的表单提交过来的数据。<form method="POST">: 定义了一个HTML表单,method="POST"意味着表单数据将在HTTP请求体中发送,比GET方法更安全,适合传输密码这类敏感信息。
c. 逐行注释与结构化分析:
<!-- 文件路径: login.php -->
<!-- ... (HTML头部和样式) ... -->
<body>
<!-- ... (外层容器) ... -->
<!-- 如果有登录错误,则显示错误提示 -->
<?php if (isset($loginError)): ?>
<div class="bg-red-50 ...">
<span><?php echo $loginError; ?></span>
</div>
<?php endif; ?>
<!-- 登录表单 -->
<form method="POST" class="space-y-5">
<!-- 用户名输入框 -->
<div>
<input type="text" id="username" name="username" required>
</div>
<!-- 密码输入框 -->
<div>
<input type="password" id="password" name="password" required>
</div>
<!-- 登录按钮,注意 name="login" -->
<button type="submit" name="login">登录</button>
</form>
<!-- ... (其他HTML) ... -->
</body>
</html>
逻辑拆解:
login.php本身不处理任何逻辑,它就是一个纯粹的“信息采集员”。它的任务就是提供两个输入框(name分别为username和password)和一个提交按钮(name为login),然后把用户填写的信息打包,通过POST方式,恭恭敬敬地交给“总指挥”index.php去处理。如果index.php发现暗号不对,会把错误信息$loginError传回来,这里就负责把它显示给用户看。
3. “总指挥”的决断 - index.php
所有认证的核心逻辑,都在这里!
a. 文件路径定位: index.php
b. 全面讲解引用:
session_start(): 启动或恢复一个会话。这是使用$_SESSION变量的前提,必须在任何输出之前调用。它就像打开了岗亭里那个“小本本”。isset(): 检查一个变量是否已设置并且非NULL。我们用它来判断用户是否提交了表单,或者Session里是否已经有登录标记。password_verify(): 用于验证一个密码是否和指定的哈希值匹配。这是password_hash()的“官方CP”。$_SESSION: PHP的另一个超全局变量,用于在用户的多个页面请求之间存储信息。我们把登录状态就存在这里。header('Location: ...'): 发送一个原始的HTTP头,常用于页面重定向。exit: 终止脚本执行。重定向后通常要加上它,防止后续代码意外执行。
c. 逐行注释与结构化分析:
// 文件路径: index.php
<?php
// ...
// 引入配置文件,获取账号密码
require_once 'config.php';
// 开启Session,准备记录登录状态
session_start();
// 函数:检查当前用户是否已登录
function isLoggedIn() {
// 检查Session中是否有'authenticated'标记,并且值为true
return isset($_SESSION['authenticated']) && $_SESSION['authenticated'] === true;
}
// ---- 核心:登录处理 ----
// 检查用户是否点击了名为 'login' 的按钮提交了表单
if (isset($_POST['login'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// 验证用户名是否正确,并使用 password_verify 验证密码
if ($username === USERNAME && password_verify($password, PASSWORD_HASH)) {
// 验证通过!在Session中打上“已认证”的标记
$_SESSION['authenticated'] = true;
// 重定向到主页,刷新页面以展示登录后的内容
header('Location: index.php');
exit;
} else {
// 验证失败,准备一条错误消息
$loginError = '用户名或密码错误';
}
}
// ... (登出处理) ...
// ---- 核心:权限守卫 ----
// 如果用户未登录 (isLoggedIn() 返回 false)
if (!isLoggedIn()) {
// 把 login.php 的内容“搬”过来显示,不让他看到云盘主页
include 'login.php';
// 终止后续所有代码的执行,保卫主页内容
exit;
}
// 如果代码能执行到这里,说明用户已经登录成功!
// 后面就是文件管理等核心功能代码...
?>
d. 上下文关联:
整个流程就像一个精密的齿轮:
- 用户访问
index.php。 index.php的“权限守卫”代码立刻执行isLoggedIn()检查。- 第一次访问,
$_SESSION['authenticated']肯定不存在,isLoggedIn()返回false。 - 守卫发现是“闲杂人等”,立刻
include 'login.php',把登录页面展示出来,并exit掉,后面的代码根本没机会执行。 - 用户在
login.php页面输入账号密码,点击提交。表单数据被POST到index.php。 index.php的“登录处理”代码块被触发(因为isset($_POST['login'])为true)。- 它从
config.php获取正确的用户名和密码哈希,与用户提交的数据进行password_verify()比对。 - 比对成功,就在
$_SESSION里存入['authenticated' => true],然后header('Location: index.php')刷新一下页面。 - 浏览器收到重定向指令,再次访问
index.php。 - 这一次,“权限守卫”再次执行
isLoggedIn(),发现$_SESSION['authenticated']已经是true了! - 守卫放行,不再执行
include 'login.php'和exit。代码继续往下执行,用户最终看到了云盘的主界面。
完美闭环!
总结与预告
今天,我们成功为云盘安装了一套可靠的“门禁系统”。我们理解了PHP Session的“通行证”机制,并深入代码,搞懂了从配置、前端表单到后端验证的每一个细节。
现在,我们的云盘已经是一个安全的私人空间了。但是,一个空荡荡的城堡有什么意思呢?
在下一篇中,我们将进入最核心、最激动人心的部分——“乾坤大挪移”:文件上传与列表展示的艺术。我将带你揭秘文件是如何从你的电脑“飞”到服务器上,并被优雅地展示出来的。
准备好迎接你的第一个文件了吗?我们下期见!

被折叠的 条评论
为什么被折叠?



