beego企业级权限管理应选用casbin而非手写rbac中间件,因其支持角色继承、通配符、动态授权且校验为o(1);需分层控制菜单/按钮/api权限,统一策略源;数据范围须通过casbin自定义逻辑或service层scope参数强制管控。

Beego 企业级权限管理平台的核心难点不在“能不能做”,而在于“要不要自己从零实现 RBAC”——绝大多数项目直接集成 casbin 更省力、更健壮、更易维护。
为什么别手写权限中间件?
很多人在 Beego 里写一个 AuthFilter,手动查数据库比对用户-角色-菜单关系,结果上线后发现:并发一高就卡在权限查询上;菜单改个路径,所有关联逻辑全得改;数据范围(如“仅本部门”)硬编码进 SQL,后续扩展成本爆炸。
- Beego 的
Filter是同步阻塞执行的,每次请求都走一遍 ORM 查询,没缓存就是裸奔 - 手写策略逻辑无法自然支持“角色继承”“资源通配符”“运行时动态授权”等企业刚需
- 权限变更后需手动清空 session 或刷新缓存,极易出现“已删权限但还能访问”的线上事故
casbin + beego-orm-adapter 是当前最稳的组合
它把权限策略加载进内存 map,请求校验是 O(1) 查找;策略增删改查一行代码搞定;模型定义(rbac_model.conf)和存储(MySQL 表 casbin_rule)完全解耦。
- 安装适配器:
go get github.com/casbin/beego-orm-adapter/v2 - 初始化时加载策略:
e, _ := casbin.NewEnforcer("rbac_model.conf", adapter) - 校验只需一句:
e.Enforce("alice", "/api/users", "GET"),返回true或false - 注意:adapter 默认用
beego.ORM,确保你已调用orm.RegisterDriver和orm.RegisterDataBase
菜单权限和按钮权限必须分层控制
前端 EasyUI 或 Layui 渲染菜单时,不能只靠后端返回“有/无菜单权限”,否则按钮级操作(如“导出”“审核”)会失控。真实场景中,菜单可见性、按钮显隐、API 接口调用三者权限必须统一来源。
- 推荐做法:所有按钮绑定唯一标识,如
btn:order:export,在 casbin 策略中作为obj字段存储 - 后端接口路由按 RESTful 设计,如
POST /api/orders/export,对应策略p, role_admin, /api/orders/export, POST - 前端请求前先调用
/api/auth/check携带 action 校验,避免无效请求暴露权限边界
数据范围(DataScope)不能只靠 SQL WHERE 过滤
“仅查看本部门数据”这类需求,如果只在 DAO 层拼 WHERE dept_id = ?,容易漏掉关联查询、统计聚合、导出等非列表接口,导致越权读取。
- 正确做法:在 casbin model 中加入
[policy_effect]自定义逻辑,或在 Enforcer 上挂载addFunction实现数据域判断 - 更轻量方案:所有涉及数据查询的 Service 方法,统一接收
scope *DataScope参数,由中间件根据用户角色注入,DAO 层强制使用 - 切记:导出接口必须走同套 scope 控制,不能另起一套逻辑,否则审计时会翻车
真正难的不是把权限跑起来,而是让权限规则能被产品、测试、DBA 看懂且可验证。建议所有策略写进 SQL 初始化脚本,配合注释说明适用角色和场景,而不是藏在 Go 代码里靠人肉维护。











