From b81611ba72379bdd4a14253481f86087d95ea594 Mon Sep 17 00:00:00 2001 From: zhangwenjian Date: Fri, 14 Aug 2026 21:42:59 +0800 Subject: [PATCH] =?UTF-8?q?chore=F0=9F=94=A7:=20=E6=B8=85=E7=90=86=20refre?= =?UTF-8?q?sh=5Ftoken=20=E7=9A=84=E6=AE=8B=E7=95=99=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 接口移除后,库中仍留有三类记录:sys_api 的接口登记、sys_menu_api_rule 的 菜单绑定、casbin_rule 的策略。留着会让「接口管理」列出一个不存在的端点, 角色配置里也仍可勾选。 - 新装:从 db.sql 与 db-sqlserver.sql 的种子数据中删除该接口 - 已有部署:新增迁移清理,按 path 匹配而非固定 id,因为执行过 `server -a` 重新注册接口的库中 id 会与官方种子数据不同 --- .../1786700002000_remove_refresh_token_api.go | 61 +++++++++++++++++++ config/db-sqlserver.sql | 1 - config/db.sql | 1 - 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 cmd/migrate/migration/version/1786700002000_remove_refresh_token_api.go diff --git a/cmd/migrate/migration/version/1786700002000_remove_refresh_token_api.go b/cmd/migrate/migration/version/1786700002000_remove_refresh_token_api.go new file mode 100644 index 00000000..f02936d8 --- /dev/null +++ b/cmd/migrate/migration/version/1786700002000_remove_refresh_token_api.go @@ -0,0 +1,61 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +// 清理 GET /api/v1/refresh_token 的残留权限数据。 +// +// 该路由已随 issue #820 的修复移除:它允许用业务 token 换取新 token,而续期 +// 上限 MaxRefresh 依据的 orig_iat 每次续期都被重置,上限永远无法到达。 +// +// 路由虽已删除(请求会返回 404),但已有部署的库中仍残留三类记录:接口登记、 +// 菜单与接口的绑定、Casbin 策略。留着会让「接口管理」列出一个不存在的端点, +// 角色配置里也仍可勾选,造成误解。 +// +// 按 path 匹配而非固定 id —— 使用者若执行过 `server -a` 重新注册接口,id 会 +// 与官方种子数据不同。 +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1786700002000RemoveRefreshTokenApi) +} + +const refreshTokenPath = "/api/v1/refresh_token" + +func _1786700002000RemoveRefreshTokenApi(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + var apiIds []int + if err := tx.Model(&models.SysApi{}). + Where("path = ? AND action = ?", refreshTokenPath, "GET"). + Pluck("id", &apiIds).Error; err != nil { + return err + } + + if len(apiIds) > 0 { + // 先断开绑定,再删接口本身,避免遗留悬空外键 + // 连接表由 GORM many2many 生成,列名为 sys_api_id 而非 api_id + if err := tx.Exec("DELETE FROM sys_menu_api_rule WHERE sys_api_id IN ?", apiIds).Error; err != nil { + return err + } + if err := tx.Where("id IN ?", apiIds).Delete(&models.SysApi{}).Error; err != nil { + return err + } + } + + // casbin_rule 才是 adapter 实际使用的表,策略按路径存储,与 sys_api 的 + // id 无关,因此即使上面没匹配到接口也要清理 + if err := tx.Exec( + "DELETE FROM casbin_rule WHERE ptype = 'p' AND v1 = ?", refreshTokenPath, + ).Error; err != nil { + return err + } + + return tx.Create(&common.Migration{Version: version}).Error + }) +} diff --git a/config/db-sqlserver.sql b/config/db-sqlserver.sql index 0ba4168c..f73bd7dd 100644 --- a/config/db-sqlserver.sql +++ b/config/db-sqlserver.sql @@ -37,7 +37,6 @@ INSERT INTO sys_api (id, handle, title, path, type, "action", created_at, update (45, 'go-admin/app/admin/apis.SysMenu.GetMenuTreeSelect-fm', '菜单权限列表【角色配菜单使用】', '/api/v1/roleMenuTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.762', '2021-06-17 11:48:40.732', NULL, 0, 0), (46, 'go-admin/app/admin/apis.SysDept.GetDeptTreeRoleSelect-fm', '角色部门结构树【自定义数据权限】', '/api/v1/roleDeptTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.809', '2021-06-17 11:48:40.732', NULL, 0, 0), (47, 'go-admin/app/admin/apis.SysRole.Get-fm', '角色通过id获取', '/api/v1/role/:id', 'BUS', 'GET', '2021-05-13 19:59:02.850', '2021-06-17 11:48:40.732', NULL, 0, 0), -(48, 'github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth.(*GinJWTMiddleware).RefreshHandler-fm', '刷新token', '/api/v1/refresh_token', 'SYS', 'GET', '2021-05-13 19:59:02.892', '2021-06-13 20:53:49.278', NULL, 0, 0), (53, 'go-admin/app/admin/apis.SysConfig.GetPage-fm', '参数列表', '/api/v1/config', 'BUS', 'GET', '2021-05-13 19:59:03.116', '2021-06-17 11:48:40.732', NULL, 0, 0), (54, 'go-admin/app/admin/apis.SysConfig.Get-fm', '参数通过id获取', '/api/v1/config/:id', 'BUS', 'GET', '2021-05-13 19:59:03.157', '2021-06-17 11:48:40.732', NULL, 0, 0), (55, 'go-admin/app/admin/apis.SysConfig.GetSysConfigByKEYForService-fm', '参数通过键名搜索【基础默认配置】', '/api/v1/configKey/:configKey', 'SYS', 'GET', '2021-05-13 19:59:03.198', '2021-06-13 20:53:49.745', NULL, 0, 0), diff --git a/config/db.sql b/config/db.sql index 5c84adf0..b4d03ee6 100644 --- a/config/db.sql +++ b/config/db.sql @@ -35,7 +35,6 @@ INSERT INTO sys_api VALUES (44, 'go-admin/app/admin/apis.SysRole.GetPage-fm', ' INSERT INTO sys_api VALUES (45, 'go-admin/app/admin/apis.SysMenu.GetMenuTreeSelect-fm', '菜单权限列表【角色配菜单使用】', '/api/v1/roleMenuTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.762', '2021-06-17 11:48:40.732', NULL, 0, 0); INSERT INTO sys_api VALUES (46, 'go-admin/app/admin/apis.SysDept.GetDeptTreeRoleSelect-fm', '角色部门结构树【自定义数据权限】', '/api/v1/roleDeptTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.809', '2021-06-17 11:48:40.732', NULL, 0, 0); INSERT INTO sys_api VALUES (47, 'go-admin/app/admin/apis.SysRole.Get-fm', '角色通过id获取', '/api/v1/role/:id', 'BUS', 'GET', '2021-05-13 19:59:02.850', '2021-06-17 11:48:40.732', NULL, 0, 0); -INSERT INTO sys_api VALUES (48, 'github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth.(*GinJWTMiddleware).RefreshHandler-fm', '刷新token', '/api/v1/refresh_token', 'SYS', 'GET', '2021-05-13 19:59:02.892', '2021-06-13 20:53:49.278', NULL, 0, 0); INSERT INTO sys_api VALUES (53, 'go-admin/app/admin/apis.SysConfig.GetPage-fm', '参数列表', '/api/v1/config', 'BUS', 'GET', '2021-05-13 19:59:03.116', '2021-06-17 11:48:40.732', NULL, 0, 0); INSERT INTO sys_api VALUES (54, 'go-admin/app/admin/apis.SysConfig.Get-fm', '参数通过id获取', '/api/v1/config/:id', 'BUS', 'GET', '2021-05-13 19:59:03.157', '2021-06-17 11:48:40.732', NULL, 0, 0); INSERT INTO sys_api VALUES (55, 'go-admin/app/admin/apis.SysConfig.GetSysConfigByKEYForService-fm', '参数通过键名搜索【基础默认配置】', '/api/v1/configKey/:configKey', 'SYS', 'GET', '2021-05-13 19:59:03.198', '2021-06-13 20:53:49.745', NULL, 0, 0);