前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Web开发权限管理神器Casbin

Web开发权限管理神器Casbin

作者头像
somenzz
发布2022-02-15 14:53:29
1.4K0
发布2022-02-15 14:53:29
举报
文章被收录于专栏:Python七号

用 Django 用的多了,再用其他语言或框架会有点吃力,因为 Django 是保姆级别的,基本上 Web 开发你能遇到的问题,都有现成的解决方案,拿来就用即可。比如说权限管理,甚至数据库里面的表都给你设计好了。如果没有 Django,比如说你用了 Flask,或者 FastAPI,那该怎么做权限管理?

你可能会说自己建立角色表、权限表,角色和权限的映射表,再为用户配置角色,为角色配置权限,最后在视图函数或拦截器上编写判断逻辑。

没错,基本是这样,但是实现起来非常麻烦,有没有比较简单又高效的方案呢?有,那就是 Casbin。

Casbin 是什么

Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。GitHub 有 11.1 k 的星。

Casbin 还是一个通用的框架,支持主流的编程语言:

Casbin 可以做:

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

Casbin 不能:

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

Casbin 如何工作

在 Casbin 中, 访问控制模型被抽象为基于 PERM (Policy, Effect, Request, Matcher) 的一个文件。因此,切换或升级项目的授权机制与修改配置一样简单。

举个例子吧,编写这样一个模型配置文件 model.conf:

代码语言:javascript
复制
# Request definition
[request_definition]
r = sub, obj, act
 
# Policy definition
[policy_definition]
p = sub, obj, act
 
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
 
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

你说 sub、obj、act 是啥?其实是抽象出来的东西,你可以这么理解:把 sub 当作用户角色,把 obj 当作资源对象,比如说 api 的路径,act 当作行为,比如说 get 或 post 请求。

这个模型配置文件就表示当请求的 sub,obj,act 等于策略中的 sub,obj,act 的时候就放行,否则拒绝。

现在来编写策略文件:policy.csv

代码语言:javascript
复制
p, root, /api/users/confirm, GET 
p, admin, /api/users/confirm, GET

这个策略就表示如果 sub 是 root 或者 admin 的时候,就可以对 /api/users/confirm 执行 GET 请求。

然后在请求拦截器加上这样的判断逻辑:

代码语言:javascript
复制
import casbin

e = casbin.Enforcer("path/to/model.conf", "path/to/policy.csv")


def 拦截器(*args **kwargs)
 sub = "admin"  # 这里写死,实际上从 request 对象获取用户角色
 obj = "/api/users/confirm"  # 实际上从 request 对象获取 URI
 act = "GET"  # 实际上从 request 对象中获取请求方法

 if e.enforce(sub, obj, act):
  print("放行")
  ...
 else:
  print("拒绝")
  ...

就这,只需在拦截器加上一小段逻辑,对原有代码基本没有入侵,使用起来是不是非常简单?

策略的配置即可放在文件中,也可以放在数据库中,做到更为灵活的配置。

安装

代码语言:javascript
复制
pip install casbin

最后的话

casbin 还有很多高级的功能,这里说的只是最简单的一种,官方文档[1]也有非常丰富的例子:

我也正在学习 casbin,分享给需要的朋友们。如有问题,留言交流。

参考资料

[1]官方文档: https://casbin.org/docs/zh-CN/get-started

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Casbin 是什么
  • Casbin 如何工作
  • 安装
  • 最后的话
    • 参考资料
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档