阿里百秀项目第三弹:后台登陆

本文详细介绍了后台登录的实现过程,包括HTML表单的调整、登录业务逻辑处理、数据库连接查询以及访问控制和登录状态保持。在HTML部分,强调了form属性的设置。在业务逻辑中,讲解了PHP如何处理POST请求,进行参数校验和错误信息展示。此外,还探讨了使用Cookie和Session来实现登录状态的保持,确保访问控制的安全性。
摘要由CSDN通过智能技术生成

1.处理 HTML 中需要调整的地方

在写静态页面时,我们一般不会关心功能实现过程中对 HTML 的要求,特别是表单一类的 HTML,在实际开发功能时我们一般都会使用到表单的 action 和 method 属性,还有表单元素的 name 属性等等。
这里我们需要调整的有:
1.给 form 表单添加 action 和 method 属性、添加novalidate和autocomplete=“off”:

action="<?php echo $_SERVER['PHP_SELF'];?>"
//提交给自己
method="post"
novalidate
//表示取消html5中邮箱的校验  -
autocomplete="off"
//关闭客户端自动完成

2.给邮箱和密码框添加 name 属性
3.将登录按钮由 a 链接改为 button 提交按钮

2.登录业务逻辑

用户第一次访问登录页面(GET),服务端会返回(响应)一个包含登录表单的 HTML 给浏览器。
当用户填写完表单点击登录按钮,浏览器会再发送一个 POST 请求到 login.php 文件。
我们需要在这个文件中处理 POST 请求,login.php 文件的处理逻辑大致如下:
在这里插入图片描述
2.1判断是否以 POST 方式请求
在 PHP 脚本开始执行时,判断当前请求是否是以 POST 方式提交:

if($_SERVER['REQUEST_METHOD']==='POST'){
  login();
  //login()是登陆函数
}

2.2参数处理
如果是 POST 提交,则通过 $_POST 关联数组获取用户在表单中填写的邮箱和密码。

合法化校验
如果邮箱或者密码没有填写的话,应该提示用户完整填写邮箱和密码,并结束之后的逻辑(没必要执行了)。

 if(empty($_POST['email'])){
        $GLOBALS['message']='请填写邮箱';
        return;
      }
 if(empty($_POST['password'])){
        $GLOBALS['message']='请填写密码';
        return;
      }

错误信息展示
如果执行逻辑过程中出现错误,界面上必须要有一个错误信息的展示,我们的方案就是在出错过后,定义一个错误信息的变量,最后在渲染 HTML 时输出到 HTML 中:

把一个变量通过 echo 或 print 的方式添加到 HTML 指定位置,就叫输出
通过animate.css库给图表添加一个错误抖动的效果
渲染 HTML 时输出:

 <form class="login-wrap <?php echo isset($message) ? 'shake animated' : ''?>" 
 action="<?php echo $_SERVER['PHP_SELF'];?>"  method="post" novalidate autocomplete="off"> 

<?php if (isset($message)): ?>
      <div class="alert alert-danger">
        <strong>错误!</strong> <?php echo $message;?>
      </div>
<?php endif ?>

接收参数

$email = $_POST['email'];
$password = $_POST['password'];

2.3校验邮箱与密码(假数据)
如果邮箱和密码都正确,则跳转到后台页面,反之继续输出当前登录表单 HTML。

if($email != 'admin'){
    $GLOBALS['message']='邮箱与密码不匹配';
    return;
  }

if($email != 'admin123'){
    $GLOBALS['message']='邮箱与密码不匹配';
    return;
  }
  
header('Location:/admin/');

2.4表单状态保持
当用户填写错误的邮箱或密码提交过后,再次得到 HTML 页面显示时,除了可以看见错误信息,应该也可以看到之前填写邮箱(非敏感数据)

解决办法也很简单:在输出 <input> 时为其添加一个 value 属性,值就是 $_POST[‘email’]:

<input id="email" name="email" type="email" class="form-control" 
 value="<?php echo isset($_POST['email']) ? $_POST['email'] : ''; ?>" placeholder="邮箱" autofocus>

3.数据库连接查询

3.1根据邮箱查询用户并比对密码

通过md5加密密码
1.cmd进入php
2.输入命令行:php -a
3.输入 : echo md5(‘123’);

 require_once "../config.php";
 $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    
  if(!$conn){
    exit('<h1>连接数据库失败</h1>');
  }

  $query=mysqli_query($conn,"select * from users where email ='{$email}' limit 1;");

  //获取登陆用户
  $user=mysqli_fetch_assoc($query);

  if(!$user){
    //用户名不存在
    $GLOBALS['message']='用户名不存在';
    return;
  }

  if($user['password'] != md5($password)){
    //密码不正确
      $GLOBALS['message']='邮箱与密码不匹配';
      return;
  header('Location:/admin/'); 
    }

4.访问控制及登陆状态保持

名词解释:
访问控制,是指我们对特定页面是否允许被访问的判断逻辑。

至此,我们已经完成了登录校验的功能,但是如果我们记住登陆后(约定如此)才可以访问的页面地址,直接在地址栏输入,则可以越过登陆页面的限制直接访问。这样的话登录页形同虚设,没有任何价值。

解决方法:在需要访问权控制页面加上访问控制(硬性控制),具体方法就是根据用户之前的登录状态来决定是否可以访问,如果没有登录就不让其访问。

Cookie 方案
由于 HTTP 协议本来就是无状态的(每一次见面都是“初次见面”),如果单纯的希望通过我们的程序记住每一个访问者是不可能的,所以必须借助一些手段或者说技巧让服务端记住客户端,这就是 Cookie
在这里插入图片描述
Cookie 简介
Cookie 就像是在超级市场买东西拿到的小票,由超市(Server)发给消费者(Browser),超市方面不用记住每一个消费者的脸,但是他们认识消费者手里的小票(Cookie),通过小票知道消费者之前的一些消费信息(在服务端产生的数据)。

我们尝试通过 Cookie 解决以上问题:
在登录成功过后(在登录提交这一次请求的过程中是知道登录状态的)跳转页面之前,设置当前客户端的 Cookie。

Session 方案
通过 Cookie 方案实现了服务端对客户端登录状态的辨别,但是由于 Cookie 是下发给客户端由客户端本地保存的。换而言之,客户端可以对其随意操作,包括删除和修改。那么如果客户端随意伪造一个 Cookie 的话,对于服务端是无法辨别的,就会造成服务端被蒙蔽,误认为客户端已经登录======>伪造 Cookie 登录

于是乎就有了另外一种基于 Cookie 基础之上的手段:Session
在这里插入图片描述
Session 简介
Session 区别于 Cookie 一个很大的地方就是:Session 数据存在了服务端,而 Cookie 存在了客户端本地,存在服务端最大的优势就是,不是用户想怎么改就怎么改了。

Session 结构
在这里插入图片描述
Session 这种机制会更加适合于做登录状态保持,因为客户端不再保存具体的数据,只是保存一把“钥匙”,伪造一把可以用的钥匙,可能性是极低的,所以不需要在意。

所以我们将之前使用 Cookie 的地方改为使用 Session:
login.php文件:注意:session_start()

//给用户找箱子(如果之前有就用之前的,没有就给个新的)
session_start();

if(!$user){
    //用户名不存在
    $GLOBALS['message']='用户名不存在';
    return;
  }

if($user['password'] != md5($password)){
    //密码不正确
      $GLOBALS['message']='邮箱与密码不匹配';
      return;
    }

  //存一个登陆标识
  //$_SESSION['is_logged_in']=true;
  //直接拿到登录用户的信息
  $_SESSION['current_logged_user']=$user;


  //一切ok 可以跳转
  header('Location:/admin/');

index.php文件中

//校验数据当前访问用户的箱子(session)有没有登录的登陆标识

session_start();

if($_SESSION['current_logged_user']){
  //没有当前登录用户信息,意味着没有登录
  header('Location:/admin/login.php');
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值