Skip to content

中间件

跨域

跨域中间件已经在服务启动文件 cmd/serve/serve.go 中全局注册,跨域配置位于 config/cors.yaml

管理员认证

认证中间件有两个:

AdminAuth

正常的验权中间件,它解析请求 token > 没有 token 提示需要登录,token 验证失败也需要登录,就是说只要使用了该中间件,不登录不行的。

基类注册的所有路由,都已经注册了此中间件,如下:

go
// RegisterBaseRoutes 注册通用 CRUD 路由
func RegisterBaseRoutes(h IHandler, group *gin.RouterGroup) {
	group.POST("/list", middleware.AdminAuth(), middleware.AdminPermission(), h.List)
	group.POST("/create", middleware.AdminAuth(), middleware.AdminPermission(), h.Create)

    // ......
}

如果你的某个方法要求不登录可访问,需要自行单独注册路由(对于基类已有方法则可能需要放弃调用基类的 RegisterBaseRoutes 方法,自行逐一注册该控制器的所有路由)。

AdminAuthOptional

可选的认证中间件,有请求 token 则解析并注入管理员信息,没有 token 也继续放行。

双认证中间件的设计目的

  1. 比如有的接口不登录也能访问,但是如果你登录了,我会响应更多数据。
  2. 比如获取登录配置的接口,已登录的我就直接跳转到后台,不需要重复登录。
  3. ......

管理员鉴权

鉴权中间件(AdminPermission)是根据系统的 RBAC 权限体系,对已登录管理员的请求进行验权,使用方式是注册路由时:

go
// 必须登录,同时检查权限
group.POST("/list", middleware.AdminAuth(), middleware.AdminPermission(), h.List)

认证中间件,基控制器默认已经为所有路由注册了验权中间件,也就是所有后台访问默认都需要验权。

认证中间件,如果你的某个方法要求无需验权可访问,需要自行单独注册路由(对于基类已有方法则可能需要放弃调用基类的 RegisterBaseRoutes 方法,自行逐一注册该控制器的所有路由)。

验权中间件实现

阅读下面的内容您可能需要先理解 菜单与权限规则 部分。

验权和登录中间件是配套使用的,管理员未登录则无法验权,直接验权失败。

在验权中间件内,我们获取了 Gin 框架提供的当前路由的 路由模式,其格式大概是这样的:/admin/auth/group/get/:pk

然后我们获取当前登录管理员的所有 菜单和权限节点name 进行精确匹配,匹配上了就证明管理员是有权限的。

略微有点特殊的地方是:/list/get 请求,会额外验证 /read 权限节点,比如:同时验 /list OR /read 节点,一个节点匹配成功则认为管理员是有 list 接口访问权限的。

管理员日志

管理员操作日志中间件专门用于记录管理员日志。本中间件在注册后台路由时,注册到了 /admin 的分组上。

内部流程也是获取 Gin 框架提供的当前路由的 路由模式,然后仅记录 POST 请求的日志、实现了多处标题源等,对此有兴趣的小伙伴可以转到:管理员日志管理和日志中间件,日志标题读取的极限优化