Casbin权限控制需严格匹配模型与适配器字段顺序、显式调用LoadPolicy()验证加载、Enforce参数顺序须与模型request_definition一致,且策略变更后需手动刷新。
Go 语言里用 Casbin 做权限控制,不是“配好模型就能跑”,而是得清楚 Enforcer 初始化时机、策略加载方式、以及 Enforce() 调用时的参数语义——否则容易返回 false 却查不出原因。
Enforcer 时模型和适配器必须匹配Casbin 的核心是模型(.conf)定义规则逻辑,适配器(如 file-adapter 或 gorm-adapter)负责读取策略数据。两者不一致会导致策略不生效,但不会报错。
[request_definition] 中是 r.sub, r.obj, r.act),但适配器加载的 CSV 文件却是 sub, act, obj 字段顺序,Enforce("alice", "/data", "read") 就永远返回 false
file-adapter 时,确保文件路径可读;用 gorm-adapter 时,表名默认是 casbin_rule,字段名不能手动改(除非自定义 Adapter 实现)enforcer.LoadPolicy() 显式加载,并用 enforcer.GetPolicy() 打印验证是否真加载成功Enforce() 的参数顺序必须和模型中 [request_definition] 严格一致很多人卡在这儿:以为 Enforce(sub, obj, act) 是固定顺序,其实它完全由模型里 r.sub, r.obj, r.act 的声明顺序决定。
[request_definition]nr = sub, act, obj,那就要调用 enforce.Enforce("alice", "read", "/data")
obj(如 /api/users/123 → "users"),却没统一做 path normalize,导致 "/users" 和 "users" 不匹配enforcer.EnableLog(true),它会输出匹配过程和最终决策依据把 enforcer 当全局变量直接复用没问题,但别在每个 handler 里重复 NewEnforcer——模型解析和策略加载开销不小,且并发下可能策略不同步。
立即学习“go语言免费学习笔记(深入)”;
main.go 初始化一次,注入到 gin.Context 或作为中间件闭包变量enforcer.AddRoleForUser("alice", "admin") 或批量用 enforcer.AddPolicies(...)
AddPolicy() 等变更操作不会自动持久化到适配器(如 DB),需额外调用 enforcer.SavePolicy()(file-adapter 会写回文件;gorm-adapter 会 INSERT)最常被忽略的是策略缓存与热更新:Casbin 默认不监听文件或数据库变化,改了 policy.csv 或 DB 表后必须手动 LoadPolicy(),否则新策略永远不会生效。