【FastAPI 学习十三】基于casbin的权限校验

权限功能,是后台管理比较常用的一个功能,一般都是基于角色去管理权限,本文介绍的就是基于casbin的权限验证。

Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。支持例如 ACL, RBAC等模型校验。

参考

声明

此功能我是基于 gin-vue-admin 这个Go后台管理的项目复刻的,casbin官网显示Python版本的 PyCasbin 可用于生产。

学习理解RBAC模型

学习casbin第一步,是需要理解这个模型,这里不涉及任何编程语言,可以去这里 https://casbin.org/zh-CN/editor 自己编辑练习

当然如果没人指导,第一次看到那个模型,完全是懵的,你可以参考奇淼B站视频 https://www.bilibili.com/video/BV1qz4y167XP 介绍casbin

角色权限管理

基础使用就是 根据 角色ID 请求路径 请求方法, 断定当前请求是否可以访问,当你上面那一步模型搞明白了之后,就可以动手写一个小demo 来练习。

https://github.com/CoderCharm/fastapi-mysql-generator/tree/master/examples/demo_casbin

需要安装 pip install casbin, 然后新建一下三个文件, 放在同一文件夹下。

模型 model.conf文件

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

数据策略文件 policy.csv

p, 888, /api/userList, GET

Python测试demo如下(名字随意)


import casbin

e = casbin.Enforcer('./model.conf', "./policy.csv", True)

sub = "888"  # the user that wants to access a resource.
obj = "/api/userList"  # the resource that is going to be accessed.
act = "GET"  # the operation that the user performs on the resource.

# 添加 和 删除策略
# e.add_policy("888", "/api/user", "DELETE")
# e.remove_policy("888", "/api/userInfo", "GET")

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

可以自己动手运行一下 上面的文件, 上面的 model.conf 匹配策略, 是必须要把policy.csv策略中的三个值 和 待匹配的三个值完全 == 匹配才会通过,
当然你可以 手动修改model.conf文件中的 [matchers] 匹配策略,比如修改成角色 id 是比较大小,而不是匹配== 之类的。

总结

整体来说, 如果你理解了那个 casbin模型,后面用起来就特别简单,顺便说一下 casbinAPI文档,目前没有更新Python版本,当然这些文档函数命名都是一致的,可以参考Go的函数。

最后整体应用于FastAPI 可以参考我的项目模版 https://github.com/CoderCharm/fastapi-mysql-generator

posted @ 2021-02-05 15:48  王小右  阅读(4125)  评论(2编辑  收藏  举报