Iris本身不内置用户认证逻辑,需手动实现JWT或Session中间件:提取Authorization头Bearer Token、jwt.verify校验签名与过期、验证通过后调用ctx.User.Set(&user)绑定用户,失败时必须ctx.StatusCode(401)并ctx.StopExecution()。

直接说结论:Iris 本身不内置用户认证逻辑,但提供 ctx.User、ctx.Login、ctx.Logout 等接口配合中间件快速实现,JWT 和 Session 是最常用两种方式;别指望开箱即用,得自己写校验、签发、拦截逻辑。
JWT 认证中间件怎么写才不漏掉关键步骤
JWT 不是 Iris 自动帮你管的,你得手动解析 token、验证签名、检查过期、绑定用户到 ctx.User。漏掉任意一步都可能绕过鉴权。
- 必须用
ctx.Request().Header.Get("Authorization")提取 Bearer token,别硬写成固定 header 名 - 解析失败(如签名错、过期)要立刻调用
ctx.StatusCode(401)+ctx.JSON()+ctx.StopExecution(),否则后续 handler 仍会执行 - 验证通过后必须调用
ctx.User.Set(&user)(&user是实现了iris.User接口的结构体),否则ctx.User.Get()拿不到数据 - 别在中间件里用
ctx.Next()包裹整个逻辑——它只是“继续”,不是“条件跳过”;正确结构是if valid { ...; ctx.Next() } else { ...; ctx.StopExecution() }
Session 登录后怎么让 ctx.User 持久化
Iris 的 ctx.User 默认只在当前请求生命周期有效,Session 要手动绑定。常见错误是只存了 ID 到 session,却没在每次请求时从 session 加载并设置到 ctx.User。
- 登录成功后:先查出完整用户(含角色、权限等),再存进 session:
ctx.Session().Set("user_id", user.ID),同时调用ctx.User.Set(&user) - 鉴权中间件中:从 session 取
user_id→ 查库 → 设置ctx.User.Set(&user);如果查不到,就清 session 并ctx.StopExecution() - 别依赖
ctx.Session().GetString("user_id")后直接当用户用——类型不对,ctx.User.Get()返回的是iris.User接口,不是字符串 - Session 配置需显式启用:
app.Use(iris.Sessions().Start),且确保 cookie name、domain、secure 属性与前端匹配
ctx.Login / ctx.Logout 为什么调用后没效果
ctx.Login 和 ctx.Logout 是 Iris 提供的快捷方法,但前提是你的用户结构体实现了 iris.User 接口,且已注册了 session 或 JWT 插件。
- 必须实现
iris.User接口的GetID()、GetUsername()、GetEmail()等方法,否则ctx.Login(user)会 panic 或静默失败 -
ctx.Login(user)本质是调用ctx.Session().Set("iris_user", user)+ctx.User.Set(user),所以 session 插件未启用时它什么都不会持久化 -
ctx.Logout()只清除"iris_user"key,不会自动删其他 session 数据(比如"user_id"),得手动ctx.Session().Delete("user_id") - 前端发请求时没带 cookie(或没设
withCredentials: true),ctx.Session()就拿不到上下文,自然 login/logout 失效
密码校验和用户查询容易忽略的细节
认证流程里最常被简化的环节,恰恰是安全水位最低的地方。
- 查用户不能只靠
SELECT * FROM users WHERE username = ?—— 要用FindByUsername方法统一处理大小写、空格、SQL 注入(GORM 建议用Where("LOWER(username) = ?", strings.ToLower(username))) - 密码比对必须用
bcrypt.CompareHashAndPassword,别手写==;且校验前要确认用户存在,避免时间侧信道攻击(统一走查库+比对流程) - 登录失败次数要记录(如用 Redis + IP 或 username 为 key),连续 5 次失败后加 delay 或临时锁定,不然暴力破解分分钟
- JWT 签发时别把明文密码、敏感字段塞进 payload;只放
id、exp、iat,用户详情一律查库获取
真正难的不是写通 JWT 或 Session,而是让每个中间件里的 ctx.User 状态可预测、可审计、不跨请求污染。尤其是混合使用 JWT(API)和 Session(后台页面)时,ctx.User.Get() 返回值的来源必须一清二楚。


















