• 欢迎来到本博客,希望可以y一起学习与分享

go casbin 权限管理

笔记 benz 3周前 (08-27) 3次浏览 0个评论 扫描二维码
文章目录[隐藏]

前言

Github:https://github.com/casbin/casbin
文档: https://casbin.org/docs/zh-CN/overview

Casbin 是什么?

Casbin 可以:

  1. 支持自定义请求的格式,默认的请求格式为{subject, object, action}
  2. 具有访问控制模型model和策略policy两个核心概念。
  3. 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
  4. 支持内置的超级用户 例如:rootadministrator。超级用户可以执行任何操作而无需显式的权限声明。
  5. 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

Casbin 不能:

  1. 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
  2. 管理用户列表或角色列表。 Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin 的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系。

开始

casbin可以不需要数据库,仅仅定义两个文件(model.conf 和 policy.csv ),即可实现权限控制。

Casbin的model

Casbin 中, 访问控制模型被抽象为基于 PERM (Policy, Effect, Request, Matcher) 的一个文件,这个文件的具体呈现是一个以 .conf 作为后缀的文件。

[request_definition]
r = sub, obj, act :定义请求由三部分组成 访问用户的用户 Subject , 访问的资源 Object, 访问的动作 Action。

[policy_definition]
p = sub, obj, act : 定策略的格式 ,参数的基本意思和定义请求的相同 ,定义好了策略格式,那么对于策略(Policy)的具体描述可以存放在一个以 .csv 作为后缀的文件中。
[role_definition]
g = _, _ :是RBAC角色继承关系的定义 ,此处的 _, _ 表示 前项继承后项角色的权限

[policy_effect]
e = some(where (p.eft == allow)) :表示任意一条Policy策略满足那么结果就为allow

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act :定义了策略匹配者。匹配者是一组表达式。它定义了如何根据请求来匹配策略规则,匹配表达式的写法比较灵活根据具体需求来编写即可。
而此处的表达式意思是 ,检测用户角色 && 检测用户访问的资源 &&检测用户的动作 (&&表示并且关系,当然也有其他逻辑运算符 ||,!等)

Casbin的Policy

Policy 主要表示访问控制关于角色、资源、行为 的具体映射关系这比较好处理,但是这种映射关系怎么存储就值得考虑了。

上面的rbac策略中我们定义了三条策略和三个用户组,我们来看一下这些策略都有啥作用

  • coder是root的角色
  • zhangsan是coder的角色
  • root 可以访问 api/v1/ping 资源 通过GET动作,那么coder , zhangsan也可以访问
  • coder可以访问 api/v1/pong 资源 通过GET动作,zhangsan也能访问
  • lisi是manager的角色
  • manager可以访问 api/v1/user资源通过POST动作,lisi也可以访问

casbin的适配器 adapter 可以从存储中加载策略规则,也可将策略规则保存到不同的存储系统中。支持如: MySQL, PostgreSQL, SQL Server, SQLite3,MongoDB,Redis,Cassandra DB等等存储系统。

实例化casbin

会自动生成表casbin_rule

 

添加规则

删除规则

权限检查

参考

Go语言 gin框架集成Casbin实现访问权限控制


文章 go casbin 权限管理 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!