如何在pycasbin的RESTful API匹配器中自定义角色校验函数
Pycasbin 自定义匹配函数实现步骤
1. 实现自定义校验函数
首先根据业务逻辑编写校验函数,你的场景是判断策略中配置的单个角色是否存在于当前用户传入的角色列表中,示例代码如下:
def custom_func(p_role: str, r_roles: list[str]) -> bool: # p_role 对应策略配置里的p.role字段,r_roles对应请求传入的r.role角色列表 return p_role in r_roles
如果后续需要支持策略侧也配置多角色,修改函数逻辑判断两个列表的交集非空即可:
# 支持策略侧多角色校验的扩展版本 def custom_func(p_roles: list[str], r_roles: list[str]) -> bool: return bool(set(p_roles) & set(r_roles))
2. 将自定义函数注册到Casbin执行器
在初始化Casbin Enforcer之后,调用add_function方法注册自定义函数,确保注册的函数名和你后续在模型配置里调用的名称完全一致:
import casbin # 替换为你本地的模型文件、策略文件路径 enforcer = casbin.Enforcer("authz_model.conf", "auth_policy.csv") # 注册自定义函数,第一个参数为模型中调用的函数名,第二个为你实现的函数对象 enforcer.add_function("custom_func", custom_func)
3. 修改模型配置调用自定义函数
打开你的authz_model.conf文件,找到匹配器配置段,将原有p.role == r.role的逻辑替换为自定义函数调用即可:
[matchers] # 原有匹配器示例(根据你实际的匹配规则调整,只替换角色校验部分即可) # m = r.sub == p.sub && r.obj == p.obj && r.act == p.act && p.role == r.role # 修改后 m = r.sub == p.sub && r.obj == p.obj && r.act == p.act && custom_func(p.role, r.role)
注意:自定义函数的参数顺序需要和匹配器中传入的参数顺序完全对应,参数类型也要和你实际传入的字段类型匹配。
内容的提问来源于stack exchange,提问作者ratnesh
相关产品推荐
相关产品推荐

