当前位置: 首页 > news >正文

Casbin 学习指南

一、什么是 Casbin?

1.1 一句话介绍

Casbin是一个强大的、高效的访问控制框架,核心功能是:判断「谁」能否对「某资源」做「某操作」。

简单说,它负责判断:

谁,可以对什么东西,做什么操作?

比如:

张三能不能查看订单?
李四能不能删除用户?
管理员能不能修改系统配置?
普通用户能不能下载报表?

如果系统需要判断这些问题,就可以用 Casbin。

一句话理解:

Casbin就是系统里的权限门卫。

用户来了,Casbin 会看一眼规则:

有权限:放行
没权限:拦住

1.2 Casbin 能做什么?

Casbin 的作用是帮后端系统管理权限。

常见场景有:

  • 后台管理系统
  • 用户权限系统
  • 企业内部系统
  • SaaS 平台
  • 多租户系统
  • API 接口权限控制
  • 菜单和按钮权限控制

比如一个后台系统里有这些角色:

管理员

运营

财务

普通用户

不同角色能做的事情不一样:

管理员:可以新增、删除、修改、查看用户

运营:可以查看和修改商品

财务:可以查看订单和账单

普通用户:只能查看自己的信息

如果不用权限框架,代码里可能会写很多判断:

if user.Role == "admin" {
return true
}
if user.Role == "finance" && action == "read" && resource == "bill" {
return true
}

项目小的时候还能忍,项目一大,这种代码就会越来越乱。

Casbin 的作用就是把这些权限规则统一管理起来,让代码更清楚。

1.3 技术特点

特点

说明

多语言支持

Go、Java、C/C++、Node.js、Python、PHP、.NET、Rust 等几乎所有主流语言

模型与策略分离

Model 定义规则结构,Policy 定义具体权限数据,分开管理更灵活

高效判断

内部做了大量优化,权限判断性能极高

开箱即用

支持 ACL、RBAC、ABAC 等多种经典权限模型

社区活跃

GitHub 星标众多,持续维护更新


二、Casbin 核心概念

2.1 三个核心概念

Casbin 的设计围绕三个核心概念展开:Model(模型)、Policy(策略)、Enforcer(执行器)。

Model

定义「谁能做什么」的规则模板

相当于建筑设计图纸

Policy

具体的权限数据,谁有哪些权限

相当于实际的住户名单

Enforcer

执行权限判断的核心引擎

相当于门禁系统的控制器

2.2 Model(模型)—— 规则的骨架

Model 用 CONF 配置文件来描述权限判断的逻辑结构。

最常见的 Model 是 ACL(访问控制列表),格式如下:

  • request_definition:定义请求格式,比如 r = sub, obj, act 代表:谁(sub)、对什么(obj)、做什么(act)
  • policy_definition:定义权限格式,和 request 对应
  • matchers:核心!定义「请求」和「策略」如何匹配,比如 r.sub == p.sub 表示请求中的用户等于策略中的用户

2.3 Policy(策略)—— 具体权限数据

Policy 是具体的权限记录,每一行代表一个权限规则。

p = sub, obj, act 对应的 Policy 文件(CSV 格式)示例:

  • 第一行:alice 能读 data1
  • 第二行:bob 能写 data2
  • 第三行:admin 对 data1 有所有权限(* 代表通配符)

2.4 Enforcer(执行器)—— 核心引擎

Enforcer 是 Casbin 的核心,它加载 Model 和 Policy,然后提供 Enforce() 方法让你做权限判断。

类比:Model = 设计图,Policy = 材料,Enforcer = 建筑工人


三、Casbin 的工作原理

3.1 权限判断的完整流程

  1. 用户发起请求:alice 想读取 data1(请求 = alice, data1, read)
  2. 请求到达 Enforcer:Enforcer 接收这个请求
  3. 加载所有策略:Enforcer 查看 Policy 文件中有哪些规则
  4. Matcher 匹配:把请求代入 Matcher 公式,逐一对比每条 Policy
  5. 返回结果:匹配成功返回 true(允许),匹配失败返回 false(拒绝)

3.2 Matcher 公式详解

Matcher 是 Casbin 最核心的逻辑,下面详细拆解:

  • r.sub:请求中的用户(alice)
  • p.sub:策略中的用户(alice、bob、admin)
  • &&:必须同时满足所有条件
  • 如果 r.sub == p.sub && r.obj == p.obj && r.act == p.act 都成立 → 允许访问

进阶Matcher示例:支持通配符

加了 || p.act == "*" 之后,p.act 为 * 的规则表示对所有操作都放行。

进阶Matcher示例:基于角色

如果 Model 中定义了角色关系(g),还可以这样写:

这样 r.sub 可以是 alice,但 p.sub 可以是 role:admin,通过 g 找到 alice 的角色,再判断权限。


四、快速上手(Hello World)

4.1 安装

使用 Go 语言环境(以 Go 为例):

go get github.com/casbin/casbin/v2

4.2 创建 Model 文件(basic_model.conf)

4.3 创建 Policy 文件(basic_policy.csv)

4.4 编写代码(main.go)


五、Model 文件详解

5.1 Model 的标准结构

一个完整的 Model.conf 文件包含以下五个部分(section):

[request_definition]

定义权限验证请求的格式(通常为:谁、什么资源、什么操作)

[policy_definition]

定义策略(Policy)的格式,即权限记录的字段

[policy_effect]

定义多个策略匹配时的效果,比如 allow 优先或 deny 优先

[matchers]

定义请求与策略如何匹配的逻辑表达式

[role_definition]

(可选)定义角色继承关系,如 user -> admin

5.2 经典权限模型

ACL 模型(最简单)

适用场景:用户直接绑定资源权限,适合简单系统

RBAC 模型(基于角色,最常用)

Policy 示例:

适用场景:绝大多数后台管理系统(用户 → 角色 → 权限)


六、Policy 文件详解

6.1 CSV 格式说明

Policy 文件是 CSV 格式,每行一条策略记录,逗号分隔各字段。

格式:p, 字段1, 字段2, 字段3, ... (字段的数量和顺序,必须和Model配置中[policy_definition]p = sub, obj, act定义的完全一致

6.2 RBAC Policy 示例

Policy 文件(rbac_policy.csv):

解释:

  • p 开头:定义权限规则(admin 能读写 /admin/users,editor 能读写 /articles)
  • g 开头:定义角色关系(alice 属于 admin 角色,bob 属于 editor 角色)

6.3 运行时修改 Policy

Casbin 支持在代码运行时动态添加/删除/修改策略,无需重启应用:

  • AddPolicy():添加一条策略

  • RemovePolicy():删除一条策略

  • RemoveFilteredPolicy():删除符合条件的多条策略

  • UpdatePolicy():更新一条策略

  • SavePolicy():保存修改到策略


七、资源推荐

7.1官方资源

Apache Casbin官网

https://casbin.apache.org/

Casbin原官网

https://casbin.org/

中文教程

https://casbin.org/docs/tutorials/

在线编辑器

https://casbin.apache.org/docs/online-editor/

7.2 常见问题

Q:Casbin 和 Spring Security 有什么区别?

Casbin 是通用的权限框架,不依赖具体语言和框架;Spring Security 是 Java 技术栈的解决方案,Casbin 可以集成进 Spring Security 一起用。

Q:Policy 存在哪里?

可以存 CSV 文件、数据库(通过 Adapter),生产环境推荐用数据库。

Q:Model 和 Policy 有什么区别?

Model 是「规则模板」,Policy 是「具体数据」;Model 决定判断逻辑,Policy 决定谁有什么权限。

Q:性能怎么样?

Casbin 做了大量优化,本地判断在微秒级,性能非常好,放心在生产环境使用。

http://www.jsqmd.com/news/1093270/

相关文章:

  • RAG检索准不准怎么量化:recall@k和MRR实操
  • 总结 6.29
  • Vue 组件通信的多种实现思路
  • Kali Linux中Skipfish扫描DVWA靶场:从工具使用到漏洞验证实战
  • 基于本地大语言模型的AI助手中间件:ai-berkshire部署与集成指南
  • 哈工大高级算法课程期末2026.6复习经验 (本科生的专业限选,选修课)
  • 银行网点实时语音识别解决方案客服沟通合规质检 业务沟通全量留痕
  • GLM-5.2 编程实战全解:744B MoE、1M 无损上下文、Code Arena 全球第一,国产开源长程 Coding 模型怎么用
  • 12 java面试题: JDK 动态代理 CGLIB 动态代理 的区别和联系是什么
  • 【精通】SmartWriter v2.3:流式写作引擎 — Streaming 五种模式深度实战
  • 【黑科技软件】windows电脑鼠标连点器:自动连点+录制回放+屏幕识图,一款软件全搞定(支持中文)
  • 背景介绍与痛点分析
  • Ubuntu CentOS 安装配置SSH完整教程
  • 2026年Vue3项目架构从零到一:目录、分层、代码,每一行都给你说明白
  • ISP Pipeline中径向递减锐化方案实现(四)
  • 华为MetaERP Oracle EBS、SAP(S/4HANA)、华为 MetaERP 全体系深度对比 + 实操业务示例总览三大产品定位Oracle EBS R12:美国甲骨文传统成熟 ERP,
  • 深度解析STL缩略图生成器:Windows文件资源管理器3D预览完整实现指南
  • Day5:用户端用例执行与缺陷管理
  • 一、linux系统安装与环境准备
  • YgoMaster终极PvP对战指南:如何轻松实现局域网联机与好友对战
  • 基于大数据+Hadoop的多维度用户画像构建与个性化推荐应用研究
  • 中山市电感微久智造蜘蛛手编带机厂家
  • 游戏程序化内容生成地形建筑与任务
  • 【Excel】使用“数据透视表”统计所有项的工作量
  • Google Play大改版,AI全面进入 ,游戏出海的商店逻辑全变了
  • VerSprite推出Fork和Knife:专为现代软件开发速度打造的AI驱动型威胁建模与对抗性测试平台
  • 认知操作系统与组织死亡学:贾子理论大厦的元理论建构及其文明意涵
  • 部署 AI 总卡在依赖 / 端口?Hermes Windows 极简方案拆解
  • 把 Flask 搬进 ESP32,高中生自研嵌入式 Web 框架 MicroFlask !
  • 我觉得目前脚本速度已经足够快了-----再快就不像人了