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() 去除两边空格和换行符
忘记输入用户名/密码 用户输入不匹配 通过条件判断提前检查输入内容是否为空
忘记密码或用户名 用户输入错误 提示错误,并限制最大输入次数

🔚 小结

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

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

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

相关推荐
l***21783 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
f***14773 小时前
SpringBoot实战:高效实现API限流策略
java·spring boot·后端
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
BD_Marathon4 小时前
SpringBoot——多环境开发配置
java·spring boot·后端
实战项目5 小时前
ASP.NET实现的房产中介管理系统设计
后端·asp.net
Victor3565 小时前
Hibernate(38)如何在Hibernate中配置乐观锁?
后端
Victor3565 小时前
Hibernate(37)Hibernate的多表联合查询如何实现?
后端
摸鱼的春哥5 小时前
AI编排实战:用 n8n + DeepSeek + Groq 打造全自动视频洗稿流水线
前端·javascript·后端
码事漫谈5 小时前
Windows异步I/O与消息循环的深度对话
后端