Appearance
中间件
跨域
跨域中间件已经在服务启动文件 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 也继续放行。
双认证中间件的设计目的
- 比如有的接口不登录也能访问,但是如果你登录了,我会响应更多数据。
- 比如获取登录配置的接口,已登录的我就直接跳转到后台,不需要重复登录。
- ......
管理员鉴权
鉴权中间件(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 请求的日志、实现了多处标题源等,对此有兴趣的小伙伴可以转到:管理员日志管理和日志中间件,日志标题读取的极限优化
