Python权限管理框架 Casbin PyCasbin 的简单操作

作者:J.sky · 发表于:
2023-06-02T07:08:49.000000Z
· 更新于:
2023-08-13T22:54:57.609618Z
· Tag: Casbin 权限管理

大多数应用都会和权限与权限管理打交道,有的时候我们希望有一套拿来即用的权限管理框架,既可以在小型的个人应用中使用,又可以应付大型应用的复杂权限的管理,Casbin可以满足你的这个小小愿望.Casbin支持多种编程语言,今天我们来试试Casbin在python下的简单操作.

Casbin 简介

Casbin 是一个强大和高效的开放源码访问控制库,它支持各种 访问控制模型 以强制全面执行授权。

安装

pip install casbin

除了安装支持的casein库,我们还需要两个配置文件, model.conf 和 policy.csv。 其中, model.conf 存储了我们的访问模型, 而 policy.csv 存储的是我们具体的用户权限配置。

test.py

import casbin
import os

# model.conf 和 policy.csv 文件地址
model_dir = os.path.join(os.path.dirname(__file__), 'model.conf')
policy_dir = os.path.join(os.path.dirname(__file__), 'policy.csv')

# 加载配置文件
e = casbin.Enforcer(model_dir,policy_dir)

model.conf文件里是一个ACL (Access Control List, 访问控制列表)的配置文件

[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, alice, data1, read
p, bob, data2, write

test.py文件后边我们将进行一些关于权限的测试,下边是整个文件的代码.

import casbin
import os

# model.conf 和 policy.csv 文件地址
model_dir = os.path.join(os.path.dirname(__file__), 'model.conf')
policy_dir = os.path.join(os.path.dirname(__file__), 'policy.csv')
# 加载配置文件
e = casbin.Enforcer(model_dir,policy_dir)
sub = "alice"  # 想要访问资源的用户
obj = "data1"  # 将要被访问的资源
act = "read"  # 用户对资源进行的操作

def getEnforce(sub, obj, act):
    """
    执行器的封装
    """
    if e.enforce(sub, obj, act):
        # 允许alice读取data1
        return True
    else:
        # 拒绝请求,抛出异常
        return False

if __name__ == '__main__':
    print(getEnforce(sub,obj,act))

运行程序后会输出一个True,上边的代码我觉得不用过多的解释,看注释基本就可以明白运行的原理了.

在数据库里存放策略

将策略存放在数据库里,这样更接近实际的操作,这里我们使用casbin_sqlalchemy_adapter这个库,它封装好了很多有关casein数据库的操作的方法,可以拿来直接使用.

安装

pip install casbin_sqlalchemy_adapter

然后我们吧policy_dir更换为数据库里的一个表.更改test.py文件的前半部分:

# model.conf 和 policy.csv 文件地址
model_dir = os.path.join(os.path.dirname(__file__), 'model.conf')
# policy_dir = os.path.join(os.path.dirname(__file__), 'policy.csv')
# 组装数据库的绝对地址
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_DIR = os.path.join(BASE_DIR, 'test.db')
# 数据库访问地址
SQLALCHEMY_DATABASE_URL = "sqlite:///" + DB_DIR
# 从数据库加载casbin的policy
adapter = casbin_sqlalchemy_adapter.Adapter(SQLALCHEMY_DATABASE_URL)
e = casbin.Enforcer(model_dir, adapter)
e.add_policy(["alice", "data1", "read"])

这里我们注释掉了policy.csv文件的磁盘上的地址,跟换为数据库,当运行程序的时候,会创建一个数据库和一个表casbin_rule,其中casbin_rule存放的数据和policy.csv是一样的,我们可以通过e.add_policy()来添加策略,也可以批量添加,或是更新删除策略.

修改完代码后,运行程序,会发现和之前使用.csv文件是一样,是不是很方便,Casbin可以创建很多种权限控制模式,例如rbac等,网上介绍使用的教程很少,不过我个人感觉这个框架还是很不错的,用起来也方便,省去很多麻烦.