Golang Go语言中求教一下后台的 API 鉴权的具体实现

发布于 1周前 作者 gougou168 来自 Go语言

语言用的 go ,框架是 echo ;最近想自己撸个后台的轮子结果卡在这块了
想实现一个常规的权限管理,关联关系:用户->角色->菜单,假如角色“普通用户”没有菜单“文章管理”的权限,那文章的增删改查接口肯定要拦截"普通用户"的请求,但是不知道怎么在中间件判断用户请求的接口是文章管理的接口

想了两种方式:
方法 1:新建一个 API 表和角色表关联,手动录入接口 url 的正则表达式,在中间件里查角色关联的所有 API 数据后循环匹配当前请求 url 如果没匹配到就是没有权限;

方法 2:写一个自定义函数 func AdminApi(name string),记录 name 后返回一个中间件,在 API 管理界面展示记录到的 name 列表并可以分配给角色,每个 AdminApi 函数返回的中间件闭包判断传入的 name 是否存在于当前角色的 name 列表;

感觉两种方法都各有利弊,请教一下各位都是怎么做的 纠结好几天了🥲
Golang Go语言中求教一下后台的 API 鉴权的具体实现


更多关于Golang Go语言中求教一下后台的 API 鉴权的具体实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

一个角色对应多个 API 权限,一个用户可以拥有多个角色,一个按钮 /页面对应多个 API 权限,然后去动态渲染菜单

更多关于Golang Go语言中求教一下后台的 API 鉴权的具体实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


鉴权的时候,在中间件里面定义可变参数,静态路径不传,动态路径要传,别用正则

RBAC 鉴权,按角色分配权限,再赋予用户角色
go 有现成的实现 https://casbin.org/docs/middlewares



好的 已经在学 casbin 了

感谢指点,刚刚发现 echo 的 context 有个.Path()方法可以返回完整的注册时的路径 /admin/article/:id😁

在Golang中实现后台API鉴权通常涉及以下几个步骤:

  1. 选择鉴权方式

    • Token-based(如JWT):用户登录后生成一个JWT token,后续请求携带此token进行鉴权。
    • Session-based:通过服务器存储会话信息,每个请求携带会话ID进行验证。
    • OAuth2:适用于第三方授权。
  2. 中间件实现

    • 使用中间件(如Gin框架中的Middleware)来拦截请求,检查请求头或参数中的鉴权信息。
    • 示例代码(JWT):
      func AuthMiddleware() gin.HandlerFunc {
          return func(c *gin.Context) {
              token := c.GetHeader("Authorization")
              if token == "" {
                  c.JSON(http.StatusUnauthorized, gin.H{"error": "No token provided"})
                  c.Abort()
                  return
              }
              // 解析JWT,验证token有效性
              // 如果无效,返回401错误
              // 如果有效,继续处理请求
          }
      }
      
  3. 错误处理

    • 对于无效的token或未授权的请求,返回401 Unauthorized状态码。
  4. 集成到路由

    • 在需要鉴权的路由前添加中间件。
    • 示例:
      r := gin.Default()
      r.Use(AuthMiddleware())
      r.GET("/protected", func(c *gin.Context) {
          c.JSON(http.StatusOK, gin.H{"message": "This is protected"})
      })
      

通过上述步骤,你可以在Golang中实现一个基本的API鉴权机制。根据实际需求,可以进一步扩展和优化,如增加token刷新机制、限制token有效期等。

回到顶部