手把手教你写项目之个人云盘系统全栈开发---第2篇:“芝麻开门!”——揭秘云盘的“门禁系统”

阅读前请先下载项目源码,边读边看源码以加深理解和实操,
源码地址已放于文章末尾!

第2篇:“芝麻开门!”——揭秘云盘的“门禁系统”

欢迎回来,各位“云盘建筑师”!
在这里插入图片描述

在这里插入图片描述

在上一篇中,我们已经搭好了“施工脚手架”,成功让我们的云盘项目在本地跑了起来。现在,我们的“云盘大厦”有了一个漂亮的入口,但问题是——这个入口谁都能进,简直就像个“公共厕所”,毫无隐私可言!

这可不行。我们的私人云盘,必须得有个靠谱的“门禁系统”,只有手持“钥匙”的主人才能进入。今天,我们就来扮演一回“金牌保镖”,为我们的云盘打造一套坚不可摧的用户认证系统!

核心探秘:PHP Session 是如何发放“临时通行证”的?

想象一下,你的云盘是一个守备森严的私人城堡。当你想进去时,不能直接闯,得先去门口的岗亭(登录页面)报上你的“暗号”(用户名和密码)。

岗亭里的守卫(服务器)会核对你的暗号。如果暗号正确,他不会把城堡的主钥匙给你(这太危险了!),而是会给你一张**“临时通行证”**,并告诉你:“嘿,拿着这个,今天你在城堡里可以畅通无阻了!”

同时,守卫自己也会在一个小本本上记下:“通行证编号007,发给了张三,有效。”

这张“临时通行证”,在我们的技术世界里,就是 PHP Session

当你拿到通行证后,无论你是想去城堡的“书房”(查看文件),还是想去“后花园”(上传文件),每个关卡的守卫都会检查你的通行证。他们只需在自己的小本本上查一下这个编号是否有效,就知道该不该放行了。

等你离开城堡(关闭浏览器),这张通行证就会自动失效。下次再来?不好意思,请重新报暗号领证。

这个过程,我用一张时序图给你描绘出来,保证一清二楚:

用户 登录页面 (login.php) 服务端 (index.php) Session存储 输入“admin / admin” 发起登录请求(POST) 验证用户名和密码是否匹配 "喂,老铁,给他注册个通行证!" "OK,通行证ID: xyz123 已记录" "口令正确!重定向到云盘主页" "好嘞!我要访问主页(带着通行证ID)" "查一下,这个通行证ID有效吗?" "有效,是自己人!" "欢迎回家!(显示主页内容)" "暗号不对!显示错误信息" alt [验证成功] [验证失败] 用户 登录页面 (login.php) 服务端 (index.php) Session存储

看明白了吗?Session 机制的核心,就是通过一个独一无二的ID来跟踪用户的登录状态,避免了每次请求都得重新输入密码的尴尬。

代码实战:“四位一体”深扒登录逻辑

好了,理论学习结束,是时候亮出我们的“手术刀”,解剖代码了!咱们的门禁系统,主要由 login.phpconfig.phpindex.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分别为usernamepassword)和一个提交按钮(namelogin),然后把用户填写的信息打包,通过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. 上下文关联:
整个流程就像一个精密的齿轮:

  1. 用户访问 index.php
  2. index.php 的“权限守卫”代码立刻执行 isLoggedIn() 检查。
  3. 第一次访问,$_SESSION['authenticated'] 肯定不存在,isLoggedIn() 返回 false
  4. 守卫发现是“闲杂人等”,立刻 include 'login.php',把登录页面展示出来,并 exit 掉,后面的代码根本没机会执行。
  5. 用户在 login.php 页面输入账号密码,点击提交。表单数据被 POSTindex.php
  6. index.php 的“登录处理”代码块被触发(因为 isset($_POST['login'])true)。
  7. 它从 config.php 获取正确的用户名和密码哈希,与用户提交的数据进行 password_verify() 比对。
  8. 比对成功,就在 $_SESSION 里存入 ['authenticated' => true],然后 header('Location: index.php') 刷新一下页面。
  9. 浏览器收到重定向指令,再次访问 index.php
  10. 这一次,“权限守卫”再次执行 isLoggedIn(),发现 $_SESSION['authenticated'] 已经是 true 了!
  11. 守卫放行,不再执行 include 'login.php'exit。代码继续往下执行,用户最终看到了云盘的主界面。

完美闭环!

总结与预告

今天,我们成功为云盘安装了一套可靠的“门禁系统”。我们理解了PHP Session的“通行证”机制,并深入代码,搞懂了从配置、前端表单到后端验证的每一个细节。

现在,我们的云盘已经是一个安全的私人空间了。但是,一个空荡荡的城堡有什么意思呢?

在下一篇中,我们将进入最核心、最激动人心的部分——“乾坤大挪移”:文件上传与列表展示的艺术。我将带你揭秘文件是如何从你的电脑“飞”到服务器上,并被优雅地展示出来的。

准备好迎接你的第一个文件了吗?我们下期见!

源码下载地址:
https://thmail.lanzouu.com/if4Yn34b31cf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值