字节笔记本

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: 用户角色/权限 ID
  • path: 请求路径
  • method: HTTP 方法(GET/POST/PUT/DELETE 等)

依赖包说明

包名用途
github.com/casbin/casbin/v2Casbin 权限管理核心库
github.com/zeromicro/go-zero/core/logxgo-zero 日志组件
github.com/zeromicro/go-zero/core/stores/redisgo-zero Redis 客户端
go-zero-admin/pkg/ctxJwt项目自定义 JWT 上下文工具

使用建议

  1. Casbin 模型配置: 需要配合 Casbin 的模型配置文件(model.conf)使用,定义 RBAC 策略
  2. 权限数据加载: 确保在应用启动时从数据库加载权限策略到 Casbin
  3. 缓存优化: 使用 SyncedCachedEnforcer 可显著提升权限检查性能
  4. 错误处理: 生产环境建议完善错误响应,返回标准的 HTTP 403 状态码

源码链接

分享: