您现在的位置是:首页 > 编程 > 

用 PHP

2025-07-24 05:32:47
用 PHP PHP-Casbin 是一个非常流行的权限控制框架,支持ACL RBAC ABAC 等权限控制模型。它使用 Matcher 中配置的表达式来做权限决策,不仅提供了非常多的内置函数,而且还可以在Matcher中指定自定义函数。安装如果你的项目还有没有引入Casbin依赖,则需要安装一下:代码语言:shell复制composer require casbin/casbin决策器这是演示的是

用 PHP

PHP-Casbin 是一个非常流行的权限控制框架,支持ACL RBAC ABAC 等权限控制模型。

它使用 Matcher 中配置的表达式来做权限决策,不仅提供了非常多的内置函数,而且还可以在Matcher中指定自定义函数。

安装

如果你的项目还有没有引入Casbin依赖,则需要安装一下:

代码语言:shell复制
composer require casbin/casbin
决策器

这是演示的是纯原生PHP代码,先初始化一个决策器Enforcer。如果是在LaravelThinkPHPYii等主流框架中,可以直接使用对应的扩展,拿到决策器的Facade即可。

这里使用basic_model作为演示:

代码语言:ini复制
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where ( == allow))

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

接着是实例化决策器:

代码语言:php复制
<?php

require_once './vender/autoload.php';

use Casbin\Enforcer;

$enforcer = new Enforcer('path/to/basic_');
自定义函数

使用已经实例化的决策器Enforcer,调用添加函数的方法,传入方法名和方法体即可。

假设,我们需要一个检查是否是超级管理员的方法,在方法里实现,如果是超级管理就返回true,在权限决策时,如果是超级管理员,则需要放行所有权限。

那么,我们需要修改basic_modelmatchers表达式:

代码语言:ini复制
[matchers]
m = checkIsAdmin(r.sub) || (r.sub == p.sub &&  ==  && r.act == p.act)

这里checkIsAdmin就是一个自定函数,传入请求中的sub参数,返回一个bool结果。从上面的表达式m中就可以看出,如果checkIsAdmin(r.sub)返回true,就不会执行后面的表达式,即达到了超级管理员,则需要放行所有权限的要求。

接下来,就是来实现这个自定义函数checkIsAdmin:

代码语言:php复制
$enforcer->addFunction('checkIsAdmin', function(string $sub): bool {
    // 假设如果传入的 sub 等于 root ,即认为是超级管理员
    return $sub === 'root';
});
验证

上面我们添加了判断是否超级管理员的自定义函数,这里来验证一下结果。

代码语言:php复制
$res = $enforcer->enforce('aclie', 'data', 'read');
var_dump($res); // false

$res = $enforcer->enforce('root', 'data', 'read');
var_dump($res); // true

看到上面的验证,如果传入的第一个参数subroot,就返回true,就实现超级管理员放行所有权限的要求。

最后

通过这个例子,主要介绍了在PHP-Casbin中通过自定义函数,实现不一样的权限决策逻辑。可以看出,这个自定义函数的功能还是非常实用的。当我们在实际项目中,遇到需要修改权限校验逻辑的时候,并不需要过多的侵入已有的代码,就可以很方便的快速的做出修改。

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1201004.html

相关标签:无
上传时间: 2025-07-23 21:28:58
留言与评论(共有 7 条评论)
本站网友 北华大学就业信息网
12分钟前 发表
obj
本站网友 保险索赔
29分钟前 发表
这里来验证一下结果
本站网友 大连团购导航
26分钟前 发表
这里使用basic_model作为演示:代码语言:ini复制[request_definition] r = sub
本站网友 矿石种类
8分钟前 发表
本站网友 南京男孩
28分钟前 发表
就可以很方便的快速的做出修改
本站网友 马桶漏水
15分钟前 发表
实现不一样的权限决策逻辑