当前位置: 首页 > news >正文

生产环境用Go语言完成微服务搭建和业务融入

        业务场景:已经有一套在运行的php项目,但是性能和灵活性不足。需要开发部署一套go语言服务,但是要能兼容前项目的鉴权规则。那么我们除了将php的鉴权模块独立出来,放到网关,再就是在go服务里写一个同逻辑的中间件。

        

        我发现了项目中这张表里存了用户的token和创建销毁时间,也就不难猜出,原来的后端是通过这里判断token有效和时间的。

        那么作为后来者,我也可以通过这张表去对比前端携带的token是否合法,就有了以下的代码。

        

// Token验证中间件(仅通过token验证)
func TokenAuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {// 从请求头获取tokentoken := c.GetHeader("Authorization")if token == "" {c.JSON(http.StatusUnauthorized, gin.H{"success": false,"error":   "未授权",})c.Abort()return}// 去除可能的"Bearer "前缀if strings.HasPrefix(token, "Bearer ") {token = strings.TrimPrefix(token, "Bearer ")}log.Printf("前端token%s:", token)// 验证token有效性isValid := verifyToken(token)if !isValid {c.JSON(http.StatusUnauthorized, gin.H{"success": false,"error":   "未授权",})c.Abort()return}// token验证通过,继续执行后续逻辑c.Next()}
}// 通过token验证有效性
func verifyToken(token string) bool {// 查询token对应的记录type UserToken struct {Createtime int64 `json:"createtime"`Expiretime int64 `json:"expiretime"`}var userToken UserToken// 查询该token对应的记录query := `SELECT createtime, expiretime FROM fa_user_token WHERE token = ? LIMIT 1`err := dbManager.GetDB().QueryRow(query, token).Scan(&userToken.Createtime,&userToken.Expiretime,)if err != nil {if err == sql.ErrNoRows {log.Printf("token不存在: %s", token)} else {log.Printf("查询token失败: %s, 错误: %v", token, err)}return false}// 获取当前时间戳(秒级)currentTime := time.Now().Unix()// 验证是否过期isExpired := false// 1. 验证是否超过两个月(5184000秒 = 60天)twoMonthsAgo := currentTime - 5184000//2592000 一个月//1296000 半个月if userToken.Createtime < twoMonthsAgo {isExpired = truelog.Printf("token已超过两个月: %s", token)}// 2. 检查是否已主动退出/销毁(expiretime字段有值且小于当前时间)if userToken.Expiretime > 0 {if currentTime > userToken.Expiretime {isExpired = truelog.Printf("token已主动退出/销毁: %s, 销毁时间: %d", token, userToken.Expiretime)} else {log.Printf("token有效期内: %s, 过期时间: %d", token, userToken.Expiretime)}} else {log.Printf("token无过期时间设置: %s", token)}if isExpired {return false}log.Printf("token验证成功: %s", token)return true
}

        使用时作为中间件放入到函数中当做参数传入就ok了。

http://www.dtcms.com/a/553324.html

相关文章:

  • 第九课 四川料理は辛いです
  • DevEco Studio在模拟器中改变运行的 ets 文件
  • 第5讲:项目依赖管理与资源管理
  • 网站定制案例微安电力wordpress 分类合并
  • Orleans 的异步
  • comsol livelink with matlab
  • PDF文档中表格以及形状解析-后续处理(线段生成最小多边形)
  • 5G工业边缘计算网关,重构工业智能化
  • 网站中英文切换代码wordpress插件问题
  • 解析 Lua 虚拟机整数与浮解析 Lua 虚拟机整数与浮点数处理:类型转换与运算精度控制
  • 个人网站可以做充值工业设计网页
  • 【C/C++刷题集】二叉树算法题(一)
  • Java Stream 流式编程
  • 如何进入公司网站的后台怎样用vs做简单网站
  • 长春手机建站模板wordpress搜索页
  • 消除链上气泡图:为什么换仓正在成为新的链上生存策略?
  • 什么是TRS收益互换与场外个股期权:从金融逻辑到系统开发实践
  • ARM《8》_制作linux最小根文件系统
  • IntelliJ IDEA 如何全局配置 Maven?避免每次打开新项目重新配置 (适用于 2024~2025 版本)
  • vmware17安装ubuntu2204版本qemu运行armv8处理器uboot运行调试的一些工作
  • 【开题答辩全过程】以 二手房买卖与出租系统的设计与实现为例,包含答辩的问题和答案
  • 河池市城乡住房建设厅网站一人有限公司怎么注册
  • 边缘智能的创新:MLGO微算法科技推出基于QoS感知的边缘大模型自适应拆分推理编排技术
  • 前端面试题总结
  • UE5【插件】一键重命名蓝图变量、事件、函数、宏等(实现批量翻译)
  • UE5【C++】中文注释、编辑器乱码解决方法
  • 鸿蒙Flutter三方库适配指南:08.联合插件开发
  • node做网站怎么知道蜘蛛来过桂林人论坛app
  • 什么语言最适合开发 SaaS 系统:从架构视角的全面分析
  • liosam详解