zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    [Sql Server][原创]
    SQL Server T-SQL高级查询
    SQL 网文链接
    Epicor系统二次开发
    lambda表达式的变量作用域
    写一个正则表达式匹配手机号
    函数装饰器在类方法中的使用方法
    关于Django的session的使用 (装饰器版)
    Django ORM相关操作(2)
    Django ORM相关操作(1)
  • 原文地址:https://www.cnblogs.com/CharmCode/p/14377547.html
Copyright © 2011-2022 走看看