Go语言实战案例-模拟登录验证(用户名密码)

在《Go语言100个实战案例》中 案例9:模拟登录验证(用户名密码) 的完整内容,旨在帮助初学者理解如何实现用户身份验证,掌握字符串处理和条件判断的运用。


案例9:模拟登录验证(用户名密码)

🔐 安全性与交互 | 💻 基本的用户身份验证 | 👶 初学者友好


一、📘 案例目标

本案例将模拟一个简单的登录系统。用户输入用户名与密码,程序验证用户输入的正确性,并反馈登录是否成功。通过本案例,学习如何处理字符串、条件判断以及基本的输入输出操作。


二、🔍 应用场景举例

  • • 用户系统登录:用户名与密码验证
  • • 系统权限管理:用户验证并授权访问
  • • 基本的身份验证系统模拟

三、🔑 涉及知识点

知识点 说明
字符串操作 比较输入的用户名和密码
if 条件判断 判断用户输入的用户名和密码是否匹配
bufio 包使用 用于获取用户输入,避免空格导致的问题
用户交互 提示用户输入并进行反馈

四、🛠 功能需求

    1. 用户输入用户名和密码;
    1. 程序检查输入的用户名和密码是否与预设的匹配;
    1. 如果匹配,提示登录成功;如果不匹配,提示登录失败;
    1. 限制输入次数(如3次错误就退出)。

五、✅ 完整代码实现

go 复制代码
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    // 预设的用户名与密码
    const correctUsername = "admin"
    const correctPassword = "123456"

    // 设置最大登录尝试次数
    maxAttempts := 3
    attempts := 0

    // 创建 bufio.Reader 来获取用户输入
    reader := bufio.NewReader(os.Stdin)

    // 提示用户输入
    for attempts < maxAttempts {
        // 获取用户名输入
        fmt.Print("请输入用户名:")
        username, _ := reader.ReadString('\n')
        username = strings.TrimSpace(username) // 去除两边空白字符

        // 获取密码输入
        fmt.Print("请输入密码:")
        password, _ := reader.ReadString('\n')
        password = strings.TrimSpace(password) // 去除两边空白字符

        // 验证用户名和密码
        if username == correctUsername && password == correctPassword {
            fmt.Println("登录成功!欢迎进入系统。")
            return
        } else {
            attempts++
            fmt.Printf("登录失败,您还有 %d 次尝试机会。\n", maxAttempts-attempts)
        }
    }

    // 超过最大尝试次数
    fmt.Println("多次登录失败,系统退出。")
}

六、📊 示例运行

输入示例:

复制代码
请输入用户名:admin
请输入密码:123456

输出结果:

复制代码
登录成功!欢迎进入系统。

七、📌 核心实现解析

    1. 预设用户名与密码
    ini 复制代码
    const correctUsername = "admin"
    const correctPassword = "123456"
    1. 获取用户输入

    使用 bufio.NewReader 来读取用户输入,避免空格影响用户名或密码:

    css 复制代码
    username, _ := reader.ReadString('\n')
    password, _ := reader.ReadString('\n')
    1. 判断输入是否匹配

    使用 if 条件判断用户名和密码是否与预设值相符:

    ini 复制代码
    if username == correctUsername && password == correctPassword {
        fmt.Println("登录成功!")
    }
    1. 错误尝试次数控制

    最大登录尝试次数设置为 3 次,如果失败则提示并退出:

    arduino 复制代码
    if attempts >= maxAttempts {
        fmt.Println("多次登录失败,系统退出。")
    }

八、💡 拓展练习建议

    1. 增强安全性:通过加密方式保存密码(如bcrypt);
    1. 增加密码复杂度要求:如至少包含数字和字母;
    1. 改为注册功能:用户输入用户名和密码进行注册,再验证登录;
    1. 限制登录时间:例如,设置间隔时间,3次失败后等待10分钟;
    1. GUI 界面实现:尝试通过图形界面来模拟登录界面;

九、⚠️ 常见问题

问题 原因 解决方法
用户输入时有空格或换行符 ReadString('\n') 会读取换行符 使用 strings.TrimSpace() 去除两边空格和换行符
忘记输入用户名/密码 用户输入不匹配 通过条件判断提前检查输入内容是否为空
忘记密码或用户名 用户输入错误 提示错误,并限制最大输入次数

🔚 小结

通过这个案例,你学会了:

  • • 如何处理用户输入并进行字符串比较;
  • • 如何模拟简单的登录验证系统;
  • • 如何控制登录次数,避免恶意尝试。

这些是任何应用程序中常见的登录机制,了解其背后原理,将为你后续学习更高级的身份验证和安全技术打下基础。

相关推荐
小陈工35 分钟前
Python Web开发入门(十一):RESTful API设计原则与最佳实践——让你的API既优雅又好用
开发语言·前端·人工智能·后端·python·安全·restful
小阳哥AI工具40 分钟前
Seedance 2.0使用真人参考图生成视频的方法
后端
IeE1QQ3GT1 小时前
使用ASP.NET Abstractions增强ASP.NET应用程序的可测试性
后端·asp.net
Full Stack Developme2 小时前
SpringBoot多线程池配置
spring boot·后端·firefox
sxhcwgcy3 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring
稻草猫.5 小时前
Spring事务操作全解析
java·数据库·后端·spring
希望永不加班6 小时前
SpringBoot 整合 MongoDB
java·spring boot·后端·mongodb·spring
Lzh编程小栈6 小时前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
妙蛙种子3116 小时前
【Java设计模式 | 创建者模式】工厂方法模式
java·后端·设计模式·工厂方法模式
freejackman8 小时前
Java从0到1---基础篇
java·开发语言·后端·idea