博客
关于我
记住密码
阅读量:489 次
发布时间:2019-03-06

本文共 2588 字,大约阅读时间需要 8 分钟。

<div class="article-container"><header class="article-header">[login与记住密码实现](/技术绪记/PHP/28/title)\

[一位开发者的技术文章,帮助你理解如何在PHP中实现自动登录功能。]

[在网页开发中,需要实现记住密码或自动登录的功能时,通常会使用cookie进行处理。本文将介绍如何通过PHP实现记住密码,一周内免登录以及其他规则的自动登录功能。]

1. 功能需求分析

当用户登录时,选择"记住我"或者设置超时规则时,系统需要记录相应的认证信息,以便在下次访问时自动登录。常见的规则包括:

  • 一周内免登录:用户不需要每次都登录。
  • 一月内免登录:用户可以在一个月内无需重新登录。
  • 用户选择记住:用户主动选择记录登录状态。

系统应当根据用户的选择,在数据库中存储相应的cookie信息,并在下次访问时进行验证。

2. 实现方法概述

整个流程包括:

  • 用户登录时的处理逻辑

    • 用户输入username和password。
    • If选择记住登录状态,生成随机token并存储认证信息到cookie中。
    • 将cookie信息存储到数据库对应的user table中。
  • 自动登录验证

    • 检查cookie是否存在。
    • 从数据库中取出用户信息,验证cookie中的认证信息是否正确。
    • 如果验证成功,自动建立session并跳转到指定页面。
    • 如上述验证失败,显示对应的错误信息并跳转到登录页面。
  • 3. 具体实现代码

    下面将展示实现这一功能的关键代码部分,并附有详细注释。

    login.php:

    [\begin{php}// 接收用户提交的数据$username = trim($_POST['username']);$password = md5(trim($_POST['password']));

    // 获取请求的url$refUrl = $_GET['req_url'];

    // 判断是否需要记住登录状态$remember = isset($_POST['remember']) ? $_POST['remember'] : 0;

    // 检查必填字段是否存在if (empty($username) || empty($password)) {$err_msg = "请填写完整的用户名和密码";} else {// 从数据库中查找用户信息$userRow = getuser-info($username, $password);

    if (empty($userRow)) {    $err_msg = "用户名或密码错误";} else {    // 成功登录,设置session    $_SESSION['user_info'] = $userRow;    // 如果用户选择记住登录状态,设置cookie    if ($remember) {        // 将username和随机生成的token存入cookie        setcookie("remember_username", $username, 1, time() + 60 * 60, '127.0.0.1');        setcookie("remember_token", md5(uniqid()), 1, time() + 60 * 60, '127.0.0.1');    }    // 跳转到指定页面    if (strpos($refUrl, 'login.php') === false) {        header("Location: $refUrl");    } else {        header("Location: main_user.php");    }}

    }\end{php}]

    checklogin函数

    [\begin{php}function checklogin() {// 检查用户是否已经登录if (!isset($_SESSION['user_info'])) {// 检查是否有存储cookie的信息if (empty($_COOKIE['remember_username']) || empty($_COOKIE['remember_token'])) {// 没有cookie信息,需要重新登录header("Location: login.php?req_url=" . $_SERVER['REQUEST_URI']);} else {// 验证cookie信息$username ==$_COOKIE['remember_username'];$token = $_COOKIE['remember_token'];if ($token !== md5(uniqid())) {// 验证失败,跳转到登录页面header("Location: login.php?req_url=" . $_SERVER['REQUEST_URI']);} else {// 验证成功,获取用户信息并设置session$userRow = getuser-info($username, $password);if (!empty($userRow)) {$_SESSION['user_info'] = $userRow;} else {// 用户信息错误,跳转到登录页面header("Location: login.php?req_url=" . $_SERVER['REQUEST_URI']);}}}}}\end{php>]

    4. 注意事务

  • token生成:使用uniqid生成唯一的token,然后将这个token加密存储到数据库中,以确保每次登录时的认证信息不被窃取。

  • 权限控制:确保无法直接访问checklogin函数或在非登录页面调用,以防未授权访问。

  • 兼容性:确保生成的cookie在客户端和服务器端时间一致,避免时间差异导致的误匹配。

  • 安全性:使用https协议传输cookie,降低被截获的风险。同时,建议将cookie的域名限制在当前网站域名内,防止跨站攻击。

  • 通过以上方法,可以实现灵活且安全的记住密码功能,满足用户多样化的需求。

    转载地址:http://thhdz.baihongyu.com/

    你可能感兴趣的文章
    MS UC 2013-0-Prepare Tool
    查看>>
    MSBuild 教程(2)
    查看>>
    msbuild发布web应用程序
    查看>>
    MSB与LSB
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    MsEdgeTTS开源项目使用教程
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse更改项目名web发布名字不改问题
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>