Iris权限验证必须使用中间件链而非路由内判断,全局用app.Use()、分组用Party().Use(),RBAC需依赖iris-admin的permRoutes运行时结构,JWT校验须关注密钥一致性、时间偏差与字段完整性,macro约束须预注册不可动态修改。

权限验证必须用中间件链,不能只靠路由注册
很多人以为在 app.Get("/admin", handler) 里加个 if !isAuth(ctx) 就算权限控制了,其实这既难复用、又漏拦截、更没法做 RBAC 级别的细粒度判断。Iris 的权限验证必须走中间件机制,靠 app.Use() 或 group.Use() 插入统一校验逻辑,才能确保所有匹配路由的请求都被覆盖。
常见错误是把权限检查写在 handler 内部——比如某个接口忘了加 if !hasRole("admin"),或者用了 ctx.Next() 却没处理跳过后的响应状态,导致未授权用户拿到 200 + 空数据。
-
app.Use(authMiddleware)作用于全部路由(含静态文件),适合全局 token 解析 -
adminGroup := app.Party("/admin"); adminGroup.Use(roleCheck("admin"))更精准,只约束子路径 - 中间件内务必调用
ctx.StopExecution()或ctx.StatusCode(iris.StatusForbidden)阻断后续流程,否则ctx.Next()之后 handler 仍会执行
JWT 解析失败时,错误堆栈常藏在 jwt.ParseWithClaims 返回值里
当你看到 token is expired 或 signature is invalid 这类提示,别急着改前端,先确认三件事:密钥是否一致、时间戳是否同步、token 是否被篡改。Iris 本身不封装 JWT,靠的是 github.com/golang-jwt/jwt/v5,而 jwt.ParseWithClaims 的第二个返回值才是关键错误源。
- 密钥必须严格一致:生成 token 用
jwt.SigningMethodHS256+[]byte("my-secret"),验证时也得用同一串字节,字符串前后空格都会导致失败 - 时间偏差要容忍:服务端时间比客户端快 30 秒?加
jwt.WithTimeFunc(func() time.Time { return time.Now().Add(-30 * time.Second) }) - token 字段缺失也会报错:比如 payload 里没
"exp",ParseWithClaims会直接返回ErrTokenExpired,哪怕 token 根本没过期
RBAC 权限校验需配合 iris-admin 的 permRoutes 结构
单纯解析出用户角色还不够,真正决定“这个用户能不能访问 POST /api/users”的是 iris-admin 维护的 permRoutes 映射表。它不是配置文件,而是一个运行时注册的结构体集合,包含路径、方法、角色白名单和关联中间件。
- 注册权限路由必须用
admin.RegisterPermissionRoute("/api/users", "POST", []string{"admin", "editor"}),而不是手写 map 存储 - 删除路由时,
admin.DeletePermissionRoute("/api/users", "POST")会自动触发日志输出和缓存清理,绕过它直接删底层Party会导致权限系统脱节 - 按钮级权限(如“删除用户”)需在前端传参标识,后端用
ctx.Params().Get("action") == "delete"再查一次permRoutes,不能只靠 URL 路径判断
自定义 macro 不支持运行时注册,权限参数校验要提前固化
有人想让不同角色访问不同范围的 ID,比如管理员能查 /user/{id:int},普通用户只能查 /user/{id:int min(1) max(100)},于是尝试在中间件里动态改路由宏——这行不通。Iris 的 macro 解析发生在路由注册阶段,app.Macros().Int.RegisterFunc("range", validator) 必须在任何 Get/Post 调用前完成。
- 宏函数注册顺序很重要:先
app.Macros().Int.RegisterFunc(...),再group.Get("/user/{id:int range(1,100)}", handler) - 运行时拼接的字符串如
"/user/{id:" + roleRule + "}"会被当作文本字面量,ctx.Params().GetIntDefault("id", 0)拿不到校验结果 - 若需差异化约束,应预注册多个 macro,比如
admin_id和user_id,再按角色选择对应路由注册
真正容易被忽略的是:权限中间件一旦启用,就必须覆盖所有敏感路径;而 iris-admin 的 permRoutes 是内存结构,服务重启即丢失——如果你依赖数据库加载权限规则,记得在 app.OnStarted() 里补全初始化逻辑。


















