Iris MVC中RBAC权限控制需手动注入校验逻辑,推荐在BeforeActivation中为每个注册路由动态添加checkPermission中间件,结合perm_code与通配符api_url(如/api/users/*)及独立http_method字段做实时匹配,禁用前端v-hasPermi作为唯一校验。

RBAC权限控制在Iris MVC中不能靠注解自动扫描,必须手动注入校验逻辑到请求生命周期里——因为Iris本身不内置Spring Security那样的权限框架,所有权限判断都得你亲手塞进BeforeActivation、中间件或控制器方法内部。
怎么把权限校验挂到每个控制器请求前
Iris没有@PreAuthorize这类声明式注解,得用BeforeActivation在控制器注册时动态加校验逻辑。它比全局中间件更精准:能区分不同控制器、不同方法的权限要求,且只对已注册的路由生效。
-
BeforeActivation回调里调用b.Handle注册自定义路径时,可传入前置中间件,比如checkPermission("user:edit") - 不要在
Get/Post方法体里做权限判断——那样会绕过404/403语义,前端也难统一拦截 - 若用全局中间件(如
app.Use),需手动解析当前路由+HTTP方法,再查sys_permission表里的api_url和http_method字段匹配,容易漏掉通配符(如/api/users/*)
权限点怎么对应到Iris路由路径
Iris路由支持正则和参数化(如/users/{id:int}),但权限表里的api_url字段必须能覆盖这种灵活性。直接存死路径(如/users/123)毫无意义,得用模式匹配。
- 推荐方案:权限表
perm_code存业务标识(如user:update),api_url存带通配符的路径(如/api/users/*),后端用path.Match做模糊匹配 - 避免把HTTP方法混在路径里(如
POST:/api/users),应拆成独立字段http_method,校验时联合判断 - 若用
Party("/admin")分组,权限校验中间件要能识别前缀,否则/admin/users可能被当成/users处理
为什么不能只靠前端v-hasPermi控制按钮
前端指令(如Vue的v-hasPermi)只是掩耳盗铃——URL手敲、curl直发、Postman乱调,全都能绕过。Iris后端必须每条路由都过一遍权限检查,否则user:delete权限点形同虚设。
- 最简兜底:在
BeforeActivation里对每个注册方法加checkPerm中间件,从ctx.Values().Get("userRoles")取角色,查sys_role_permission关联表 - 别把权限列表塞进JWT再每次解析——Iris没现成的JWT解析中间件,自己写容易漏
exp校验,建议登录后存Redis,key为perms:{uid},有效期同步token - 注意
BeginRequest执行时机早于路由匹配,不适合做权限判断;必须等BeforeActivation或Handle绑定后,才能拿到目标方法名和路径信息
真正卡住权限的不是“有没有角色”,而是“每次请求是否实时校验了该角色对当前路径+方法的授权”。Iris的MVC绑定机制决定了你得在Configure回调里显式插入这层判断,漏掉一次b.Handle,就等于开了一道后门。


















