字
字节笔记本
2026年2月22日
go-zero 集成 Casbin 权限认证中间件实现
本文详细解析 go-zero-admin 项目中基于 Casbin 实现的权限认证中间件,展示如何在 Go 微服务架构中集成 RBAC 权限控制。
代码概述
这是一个用于 go-zero 框架的 HTTP 中间件,通过 Casbin 库实现基于角色的访问控制(RBAC)。中间件拦截每个请求,验证用户是否有权限访问指定的 API 端点。
核心结构
AuthorityMiddleware 结构体
go
type AuthorityMiddleware struct {
CasB *casbin.SyncedCachedEnforcer // Casbin 同步缓存执行器
Rds *redis.Redis // Redis 客户端
}CasB: Casbin 的同步缓存执行器,支持并发安全且带缓存的权限检查Rds: Redis 客户端,可用于扩展缓存或会话管理
中间件初始化
go
func NewAuthorityMiddleware(CasB *casbin.SyncedCachedEnforcer, rds *redis.Redis) *AuthorityMiddleware {
return &AuthorityMiddleware{
CasB: CasB,
Rds: rds,
}
}权限检查流程
Handle 方法
go
func (m *AuthorityMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
fmt.Println("========== AuthorityMiddleware:Handle ===========")
path := r.URL.Path // 获取请求路径
method := r.Method // 获取 HTTP 方法
// 从 JWT 上下文中获取用户权限 ID
authorityId := ctxJwt.GetJwtDataAuthorityId(r.Context())
fmt.Println("authorityId", authorityId)
// 执行批量权限检查
result := batchCheck(m.CasB, strconv.FormatInt(authorityId, 10), path, method)
if !result {
logx.Errorf("---------- batchCheck: 不通过 ------------")
return // 权限不足,直接返回
}
next(w, r) // 权限通过,继续执行后续处理
}
}batchCheck 权限验证
go
func batchCheck(CasB *casbin.SyncedCachedEnforcer, authorityId, path, method string) bool {
// 使用 Casbin 执行权限检查
ok, _ := CasB.Enforce(authorityId, path, method)
if !ok {
logx.Errorf("---------- 权限不足 ------------")
return false
}
return true
}Casbin 的 Enforce 方法接收三个参数:
authorityId: 用户角色/权限 IDpath: 请求路径method: HTTP 方法(GET/POST/PUT/DELETE 等)
依赖包说明
| 包名 | 用途 |
|---|---|
github.com/casbin/casbin/v2 | Casbin 权限管理核心库 |
github.com/zeromicro/go-zero/core/logx | go-zero 日志组件 |
github.com/zeromicro/go-zero/core/stores/redis | go-zero Redis 客户端 |
go-zero-admin/pkg/ctxJwt | 项目自定义 JWT 上下文工具 |
使用建议
- Casbin 模型配置: 需要配合 Casbin 的模型配置文件(model.conf)使用,定义 RBAC 策略
- 权限数据加载: 确保在应用启动时从数据库加载权限策略到 Casbin
- 缓存优化: 使用
SyncedCachedEnforcer可显著提升权限检查性能 - 错误处理: 生产环境建议完善错误响应,返回标准的 HTTP 403 状态码
源码链接
分享: