Go语言实战:快速搭建完整的用户认证系统
前言
在本文中,我将介绍如何使用 Go 语言搭建一个包含用户注册、登录、登出功能的完整认证系统。该系统使用 SQLite 作为数据库,JWT 作为身份验证token,并实现了优雅关闭等特性。
技术栈
- Go 语言
- SQLite 数据库
- JWT (JSON Web Token)
- Gorilla Mux 路由
- Bcrypt 密码加密
系统功能
- 用户注册
- 用户登录
- 用户登出
- Token 认证中间件
- 数据库管理
- 密码加密
项目结构
Main/
├── db.go // 数据库初始化和配置
├── main.go // 主程序入口
├── middleware.go // 认证中间件
├── handlers.go // HTTP处理器
├── model.go // 数据模型
└── utils.go // 工具函数
详细实现
1. 数据库设计
在 db.go 中,我们使用 SQLite 创建了两个主要表:
- users:存储用户信息
- tokens:存储用户的认证令牌
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,email TEXT NOT NULL UNIQUE,password TEXT NOT NULL,created_at DATETIME DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,name TEXT,age INTEGER
);CREATE TABLE IF NOT EXISTS tokens (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER NOT NULL,token TEXT NOT NULL,expired_at DATETIME NOT NULL,created_at DATETIME DEFAULT CURRENT_TIMESTAMP,is_revoked BOOLEAN DEFAULT FALSE,FOREIGN KEY (user_id) REFERENCES users(id)
);
2. 数据模型
在 model.go 中定义了系统需要的各种数据结构:
type User struct {ID int `json:"id"`Email string `json:"email"`Password string `json:"password,omitempty"`CreatedAt time.Time `json:"created_at"`UpdatedAt time.Time `json:"updated_at"`Name string `json:"name"`Age int `json:"age"`
}type LoginRequest struct {Email string `json:"email" validate:"required,email"`Password string `json:"password" validate:"required,min=6"`
}type RegisterRequest struct {Email string `json:"email" validate:"required,email"`Password string `json:"password" validate:"required,min=6"`
}
3. 认证中间件
在 middleware.go 中实现了 JWT token 验证中间件:
func AuthMiddleware(db *sql.DB) func(http.Handler) http.Handler {return func(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {// 验证 tokenauthHeader := r.Header.Get("Authorization")tokenString := strings.TrimPrefix(authHeader, "Bearer ")// ... token 验证逻辑 ...})}
}
4. 主要处理函数
在 handlers.go 中实现了三个主要的处理函数:
注册处理
func RegisterHandler(db *sql.DB) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {// 1. 解析请求数据// 2. 验证邮箱是否已存在// 3. 加密密码// 4. 保存用户信息}
}
登录处理
func LoginHandler(db *sql.DB) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {// 1. 验证用户凭证// 2. 生成 JWT token// 3. 保存 token 记录// 4. 返回 token}
}
登出处理
func LogoutHandler(db *sql.DB) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {// 将 token 标记为已撤销}
}
5. 工具函数
在 utils.go 中实现了一些辅助功能:
- 密码加密和验证
- JWT token 生成
- 其他辅助函数
6. 主程序
在 main.go 中设置路由并启动服务器:
func main() {// 初始化数据库db, err := initDB()// 设置路由r := mux.NewRouter()r.HandleFunc("/register", RegisterHandler(db)).Methods(http.MethodPost)r.HandleFunc("/login", LoginHandler(db)).Methods(http.MethodPost)// API 路由组api := r.PathPrefix("/api").Subrouter()api.Use(AuthMiddleware(db))api.HandleFunc("/logout", LogoutHandler(db)).Methods(http.MethodPost)// 启动服务器srv := &http.Server{Handler: r,Addr: ":8080",}// ... 优雅关闭逻辑 ...
}
使用方法
1. 注册新用户
curl -X POST http://localhost:8080/register \-H "Content-Type: application/json" \-d '{"email":"user@example.com","password":"123456"}'
2. 用户登录
curl -X POST http://localhost:8080/login \-H "Content-Type: application/json" \-d '{"email":"user@example.com","password":"123456"}'
3. 用户登出
curl -X POST http://localhost:8080/api/logout \-H "Authorization: Bearer {your-token}"
安全特性
- 密码使用 bcrypt 加密存储
- JWT token 认证
- token 失效机制
- 防止重复注册
- 优雅关闭服务
总结
这个认证系统虽然简单,但包含了一个完整认证系统所需的基本功能。它可以作为更大项目的起点,根据需求进行扩展。例如:
- 添加邮箱验证
- 实现密码重置
- 添加角色权限
- 增加社交媒体登录
- 添加双因素认证
参考资料
- Gorilla Mux 文档
- JWT 官方文档
- Go 语言官方文档
相关文章:
Go语言实战:快速搭建完整的用户认证系统
前言 在本文中,我将介绍如何使用 Go 语言搭建一个包含用户注册、登录、登出功能的完整认证系统。该系统使用 SQLite 作为数据库,JWT 作为身份验证token,并实现了优雅关闭等特性。 技术栈 Go 语言 SQLite 数据库 JWT (JSON Web Token) G…...

Bolsig+超详细使用教程
文章目录 Bolsig介绍Bolsig的使用 Bolsig介绍 BOLSIG 是一款用于求解弱电离气体中电子玻尔兹曼方程的免费计算程序,适用于均匀电场条件下的群体实验、气体放电及碰撞型低温等离子体研究。在此类环境中,电子分布函数呈现非麦克斯韦特性,其形态…...

uni-app云开发总结
uni-app云开发总结 云开发无非就三个概念:云数据库、云函数、云存储 uni-app中新增了一个概念叫做云对象,它其实就是云函数的加强版,它是导出的一个对象,对象中可以包含多个操作数据库的函数,接下来咱们就详细对uni-…...
新闻速递丨Altair 与 Databricks 达成合作,加速数据驱动型创新
NEWS Altair 近日宣布与数据和人工智能公司 Databricks 达成战略合作,通过新一代数据统一化、图谱驱动智能和企业级人工智能(AI)技术赋能双方客户。 此次合作整合了两大平台的核心优势,将 Altair RapidMiner 平台的强大功能&…...
vscode和git 踩坑
git init经常 在 vscode push错误问题: 正确姿势:先 GitHub 上建仓库 → git clone 拉到本地 → 再用 VSCode 打开编辑 ❌ 不是:VSCode 里 git init → 再去 GitHub 选个仓库绑定 举个对比 操作流程是否推荐后果GitHub 创建仓库 → git clone → 用 VSC…...

《ATPL地面培训教材13:飞行原理》——第7章:失速
翻译:刘远贺;工具:Cursor & Cluade 3.7 第7章:失速 目录 引言失速的原因升力曲线失速恢复接近失速时的飞机行为接近失速时的飞行控制使用失速识别失速速度失速警告人工失速警告装置基本失速要求(EASA和FAR&…...

在html中如何创建vue自定义组件(以自定义文件上传组件为例,vue2+elementUI)
1、先上代码:vueUpload.js var dom <div class"upload-file"><el-upload :action"uploadFileUrl" :before-upload"handleBeforeUpload" :file-list"fileList" :limit"limit":on-error"handleUpl…...

《使用 Cesium 加载静态热力图显示的实现步骤》
Cesium——使用cesium 加载静态热力图显示 实现思路 要在 Cesium 中加载静态热力图,我们需要完成以下几个主要步骤: 1、计算热力图数据的四至范围和中心点。 2、初始化热力图并设置相关参数。 3、将数据添加到热力图中。 4、定位到热力图的位置并刷…...
Spring 事务传播行为
事务传播行为(Transaction Propagation Behavior)是指多个拥有事务的方法在嵌套调用时的事务控制方式。以下是常见的事务传播行为及其应用场景: 1. PROPAGATION_REQUIRED(默认) 定义:如果当前存在事务&…...

mfc学习(一)
mfc为微软创建的一个类qt框架的客户端程序,只不过因为微软目前有自己 的亲身儿子C#(.net),所以到2010没有进行维护。然后一些的工业企业还在继续进行维护相关的内容。我目前就接手一个现在这样的项目,其实本质与qt的思路是差不多的…...

ThreadLocal详解与实战指南
目录 1. ThreadLocal基本概念 1.1 核心原理 1.2 主要特性 2. ThreadLocal API详解 2.1 核心方法 2.2 基本使用方式 3. ThreadLocal使用场景与实战 3.1 场景一:用户身份信息传递 实现步骤 1.创建用户上下文类 2.创建过滤器或拦截器来设置和清理用户信息 …...
[FPGA基础] RAM篇
Xilinx FPGA RAM 使用指南 1. 引言 随机存取存储器(RAM)是 Xilinx FPGA 设计中用于存储和快速访问数据的重要资源。Xilinx FPGA 提供多种 RAM 类型,包括块 RAM(Block RAM)和分布式 RAM(Distributed RAM&a…...

【含文档+PPT+源码】基于微信小程序的校园快递平台
项目介绍 本课程演示的是一款基于微信小程序的校园快递平台,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带…...

【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路
目录 问题描述做题思路,解决过程思路:踩过的坑:核心代码C 语言 / C 切片:C 语言 / C 判断 ‘A’ 数量:Python 切片:Python 判断 ‘A’ 数量: 完整代码C 语言 完整代码C 完整代码Python 完整代码…...
统计文件中单词出现的次数并累计
# 统计单词出现次数 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8") f1file.read() # 读取文件 countf1.count("is") # 统计文件中is 单词出现的次数 print(f"此文件中单词is出现了{count}次")# 2.判断单词出…...
DbCreateHelper数据库创建指南
DbCreateHelper 是一个用于简化数据库创建和初始化过程的工具类,它封装了常见的数据库操作,使开发者能够更便捷地创建、配置和管理数据库。 1.主要功能 数据库创建与初始化 表结构创建与管理 数据库版本控制 数据迁移支持 数据库连接管理 基本用法…...

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?
在 Java 开发的世界里,依赖管理就像是一座看不见的桥梁,连接着项目所需的各种第三方库和框架。然而,这座桥梁并非总是稳固,稍有不慎就可能掉入 “依赖地狱”,导致项目编译失败、运行异常。2025 年,随着开源…...

ARM服务器与X86服务器核心区别分析
ARM服务器与X86服务器核心区别分析 一、架构设计与指令集差异 指令集本质 ARM:基于RISC(精简指令集),指令定长且简单,单周期执行效率高,硬件设计复杂度低,适合低功耗场景。 X86…...

人口老龄化丨AI健康小屋如何实现防病于未然
随着全球老龄化加剧,“银发浪潮” 对医疗资源、养老护理和健康管理提出了严峻挑战。 由此智绅科技应运而生,七彩喜智慧养老系统构筑居家养老安全网。 AI 健康小屋作为银发科技的创新载体,通过智能化健康监测、精准化风险预警、便捷化医疗衔…...

记录搭建自己应用中心
记录搭建自己应用中心 应用架构主应用-管理中心系统文件系统子应用 日志系统日志系统前端日志系统后端 用户系统接入使用暂未完成 研发管理需求面板消息推送任务分配应用发布 应用架构 一直想做个试试,这是一个简易版的,主要是整合下知识的,…...

git版本回退 | 远程仓库的回退 (附实战Demo)
目录 前言1. 基本知识2. Demo3. 彩蛋 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 本身暂存区有多个文件,但手快了&…...

STM32 的 GPIO和中断
GPIO的简单介绍 内部结构 施密特触发器(TTL肖特基触发器) 的工作原理: 施密特触发电路(简称)是一种波形整形电路,当任何波形的信号进入电路时,输出在正、负饱和之间跳动,产生方波或…...
【Python数据库编程实战】从SQL到ORM的完整指南
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:SQLite基础操作案例2:MySQL连接池案例3:SQLAlchemy ORM …...

【因果推断】(二)CV中的应用
文章目录 因果表征学习因果图 (Causal Diagram)“后门准则”(backdoor criterion)和“前门准则”(frontdoor criterion)后门调整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…...

分享Matlab成功安装Support Package硬件支持包的方法
分享Matlab成功安装Support Package硬件支持包的方法 文章目录 分享Matlab成功安装Support Package硬件支持包的方法一、 引言二、 操作步骤三、 附件资料四、总结 一、 引言 最近,我想学习基于Matlab simscape & Arduino实现硬件在环仿真,其中物理…...

电子级甲基氯硅烷
电子级甲基氯硅烷是一类高纯度有机硅化合物,主要用于半导体制造、光伏产业及高端电子材料领域。以下从技术特性、应用场景、生产工艺、市场动态及安全规范等方面展开分析: 一、核心特性与技术标准 高纯度要求 电子级甲基氯硅烷的纯度通常需达到99.99% 以…...
C语言面试高频题——define 和typedef 的区别?
1. 基本概念 (1) #define 定义:#define 是预处理指令,用于定义宏。作用:在编译之前进行文本替换。语法:#define 宏名 替换内容示例:#define PI 3.14159 #define SQUARE(x) ((x) * (x))(2) typedef 定义:…...
[FPGA基础] 原语简介篇
Xilinx FPGA 原语介绍指南 1. 引言 在 Xilinx FPGA 设计中,原语 (Primitives) 是 FPGA 硬件资源的最基本构建块,直接映射到 FPGA 的底层硬件结构。原语允许设计者以低级别方式控制硬件行为,优化性能、功耗和资源利用率。本文档基于 Xilinx …...

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度
目录 引言 一、性能优化:突破数据处理极限,提升运行效率 1.1 智能查询优化器:精准优化数据检索路径 1.2 并行处理技术:充分释放多核计算潜力 1.3 智能缓存机制:加速数据访问速度 二、稳定性提升:筑牢…...

热度大幅度下降,25西电经济与管理学院(考研录取情况)
1、经济与管理学院各个方向 2、经济与管理学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、应用经济及学25年相较于24年下降25分,为325分 2、管理科学与工程25年相较于24年保持不变,为375分 3、工商管理学25年相较于24年下降5分…...