当前位置:首页 > 科技  > 软件

100行代码实现审计日志中间件

来源: 责编: 时间:2023-11-28 09:36:34 284观看
导读本文转载自微信公众号「小小平头哥」,作者小小平头哥。转载本文请联系小小平头哥公众号。审计日志管理是我们在web系统开发中的常见的模块,虽然它有时并不属于业务模块的范畴,但对于系统整体来说却十分关键,用户的操作(尤

本文转载自微信公众号「小小平头哥」,作者小小平头哥。转载本文请联系小小平头哥公众号。NsS28资讯网——每日最新资讯28at.com

审计日志管理是我们在web系统开发中的常见的模块,虽然它有时并不属于业务模块的范畴,但对于系统整体来说却十分关键,用户的操作(尤其是关键操作)、用户的登录,我们的系统都应加以记录,以便后续溯源。NsS28资讯网——每日最新资讯28at.com

日志管理的方案可以看到很多,本文介绍的是一种基于Golang Gin框架的自定义中间件的实现方案,为大家抛砖引玉了。NsS28资讯网——每日最新资讯28at.com

个人认为有以下几个优势:NsS28资讯网——每日最新资讯28at.com

(1)中间件的方式可灵活地匹配路由组,从而灵活地指定需要记录日志的路由组;NsS28资讯网——每日最新资讯28at.com

(2)同一个路由组中通过context value 来区分接口是否需要记录操作日志;NsS28资讯网——每日最新资讯28at.com

(3)业务处理函数中可灵活配置需记录内容,不需集中处理。NsS28资讯网——每日最新资讯28at.com

本文转载自微信公众号「小小平头哥」,作者小小平头哥。转载本文请联系小小平头哥公众号。NsS28资讯网——每日最新资讯28at.com

01整体流程

1) 中间件函数整体的流程

图片图片NsS28资讯网——每日最新资讯28at.com

2) 业务函数流程

图片图片NsS28资讯网——每日最新资讯28at.com

02代码实现

1) 中间件函数实现

type Response struct {  Code int `json:"code" bson:"code"`}type bodyLogWriter struct {  gin.ResponseWriter  body *bytes.Buffer}func (w bodyLogWriter) Write(b []byte) (int, error) {  w.body.Write(b)  return w.ResponseWriter.Write(b)}const (  HttpRespSuccessCode = 0)// Logger 日志记录func Logger() gin.HandlerFunc {  return func(c *gin.Context) {   //备份请求体    blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}    c.Writer = blw    //继续执行请求    c.Next()    //判断记录标志    needToLog, ok := c.Get("need_to_log")    if !ok {      log.Warn("获取是否需要记录日志失败")      return    }    if !needToLog.(bool) {      return    }    //也可以在这儿加入白名单 判断是否是不需记录的URL    /*      url := c.Request.RequestURI      if strings.Index(url, "logout") > -1 ||        strings.Index(url, "login") > -1 {        return      }    */    // 获取请求的HTTP状态码    statusCode := c.Writer.Status()    // 获取请求IP    clientIP := common.GetClientIP(c)    isSuccess := false    //若HTTP状态码为200    if c.Writer.Status() == http.StatusOK {      var resp Response      // 获取返回的数据      err := json.Unmarshal(blw.body.Bytes(), &resp)      if err != nil {        log.Warn("Logs Operation Unmarshal Error: %s", err.Error())        return      }      //判断操作是否成功 需结合业务函数的返回值结构      if resp.Code == HttpRespSuccessCode {        isSuccess = true      }    }    if statusCode != http.StatusNotFound {      SetDBLog(c, clientIP, isSuccess)    }  }}// SetDBLog 写入日志表func SetDBLog(c *gin.Context, clientIP string, status bool) {  user, ok := c.Get("user")  if !ok {    log.Warn("审计日志-获取用户名失败")  }  //日志格式化 然后入库  logInfo := table.Logs{}  //构造日志ID 可使用其他方式替代  logInfo.LogID = NewNanoid()  if user != nil {    logInfo.Username = user.(string)  }  operatorType, exist := c.Get("operation_type")  if exist {    logInfo.OperationType = operatorType.(string)  }  logInfo.IP = clientIP  operation, exist := c.Get("operation")  if exist {    logInfo.Description = operation.(string)  }  if status == true {    logInfo.Description = logInfo.Description + "成功"  } else {    logInfo.Description = logInfo.Description + "失败"  }  //日志入库  err := InsertLog(logInfo)  if err != nil {    log.Warn("InsertLog %s error, %s", logInfo.LogID, err.Error())  }}// InsertLog 插入logfunc InsertLog(logs table.Logs) error {}


NsS28资讯网——每日最新资讯28at.com

2) 业务函数实现

func (User) UserLoginOut(c *ctx.Context) {  //设定记录日志标志  c.Set("need_to_log", true)  //设定操作类型  c.Set("operation_type", "用户退出登录")  //设定具体操作  c.Set("operation", "用户退出登录")  c.Success()}

3) 路由组应用

//设定路由组  UserRouter := apiV1Group.Group("users")  //为路由组应用中间件  UserRouter.Use(middleware.Logger())


NsS28资讯网——每日最新资讯28at.com

03注意事项

1) 中间件处理函数中的备份原始请求体很重要,否则可能会出现业务代码无法获取请求参数的情况;NsS28资讯网——每日最新资讯28at.com

  1. 中间件的报错不应影响原有业务逻辑。

原文链接:https://mp.weixin.qq.com/s/7HAVAAst5IyywLxdNdTQ5gNsS28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34658-0.html100行代码实现审计日志中间件

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Springboot扩展点之BeanDefinitionRegistryPostProcessor,你学会了吗?

下一篇: 实现Eureka服务注册和服务发现,你学会了吗?

标签:
  • 热门焦点
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top