go-admingo-admin
  • 指南
  • 开发
    • 进阶
    • 指令
  • 前端
  • 高阶
  • 授权
  • 帮助
  • GitHub
  • Changelog
⌘ K
标准写法
标准模块开发
服务端基础
后端目录结构
后端配置文件
启动后端服务
前端基础
前端目录结构
前端配置文件
启动前端服务
开发模式
Actions 模式
常规模式
第一个接口
分层开发
API 层
Service 层
DTO 定义
Model 定义
路由注册
多环境配置
数据库表规范
数据权限
统一响应
代码生成
生成前配置
生成业务代码
一键生成菜单
菜单绑定接口
配置角色权限
验证功能
用 AI 生成代码
进阶能力
Runtime 核心 API
认证与鉴权
日志
请求追踪
缓存
队列
文件上传
限流
定时任务
Air 热加载
Swagger 文档
代码生成工具
最后更新时间:
Open-source MIT Licensed | Copyright © 2020-present
Powered by go-admin-team

TABLE OF CONTENTS

‌
‌
‌
‌

路由注册

路由把 URL 映射到处理函数,并决定这个接口需要哪些中间件——是否要求登录、是否做角色鉴权、是否注入数据权限。

go-admin 的路由通过 init() 自注册,不需要在中心文件里手工登记。

INFO

每个模块都需要这一层,无论使用 Actions 模式 还是常规模式。两种模式的路由写法不同:前者在路由中直接挂通用 Action,后者调用自己编写的 Handler。

package 与 import

go
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/v2/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)

路由注册

接口名称说明
init系统 init 函数
registerSyPostRouter路由注册,go-admin 路由注册内置的通用函数

WARNING

go-admin 路由注册函数命名规范 格式:register{业务名称}Router

!!!如果在非代码生成模式下需要按照此格式进行命名定义。

go
func init() {
routerCheckRole = append(routerCheckRole, registerSyPostRouter)
}
// 需认证的路由代码
func registerSyPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysPost{}
r := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
}

上述代码中我们使用了两个中间件:

  1. authMiddleware
  2. AuthCheckRole

那么,为什么要使用这两个中间件呢?

通常系统使用中有些接口都有一些安全或者权限控制方面的考虑,那么我们这里的两个中间件分别控制用户登陆鉴权和角色权限鉴定;

登陆鉴权

在某种业务场景下,我们可能只需要登录鉴权,那么我们只需要使用其中一个中间件 authMiddleware 就好了;

例如:

go
func init() {
routerCheckRole = append(routerCheckRole, registerSyPostRouter)
}
// 需认证的路由代码
func registerSyPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysPost{}
r := v1.Group("/post").Use(authMiddleware.MiddlewareFunc())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
}

角色鉴权

如果我们对权限的控制级别要求的比较高,那么我们需要两个中间件组合使用 authMiddleware,AuthCheckRole 了;

例如:

go
func init() {
routerCheckRole = append(routerCheckRole, registerSyPostRouter)
}
// 需认证的路由代码
func registerSyPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysPost{}
r := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
}

无需鉴权

当然,如果接口可以匿名访问时,两个中间件authMiddleware,AuthCheckRole 都不使用即可;

例如:

go
func init() {
routerNoCheckRole = append(routerNoCheckRole, registerSyPostRouter)
}
// 无需认证的路由代码
func registerSyPostRouter(v1 *gin.RouterGroup) {
api := apis.SysPost{}
r := v1.Group("/post")
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
}

WARNING

注意两个注册切片的区别(定义见 app/admin/router/router.go):

  • routerCheckRole:需认证的路由,函数签名为 func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware)
  • routerNoCheckRole:无需认证的路由,函数签名为 func(v1 *gin.RouterGroup)

无需鉴权的路由必须注册到 routerNoCheckRole,否则仍会被并入需认证路由组的遍历中。

WARNING

从哪里获得帮助:

如果你在阅读本教程的过程中有任何疑问,可以前往提交建议。