## 方案一、修改匹配规则 >[warning] 使用内置 正则 `regexMatch` 匹配模式 一般情况的接口访问的CURD情况是需要建立4条规则,列如 ![](https://img.kancloud.cn/ed/14/ed14d1b52bfd93abba878d7b3f4fdd22_694x132.png) `tinywan` 用户请求 `/api/user `接口的`CURD`操作需要数据库的4条记录。 >[danger] Q: 我们是否可以把上面的简化为一条记录呢?答案:可以的 >[success] 以上合并主要是考虑,有些接口匹配是不需要多条记录的,而是只需要合并为一条记录就可以了。 >[success] 例如:一个管理租户(角色组)需要这个接口CURD所有接口权限或者说这个接口的CURD所有接口权限就是针对于某一个管理租户特意开设的。就可以合并为一条规则了 >[warning] 内置模式正则 regexMatch 匹配模式语法 ``` regexMatch(r.act, p.act) ``` > 假设 r.act 是`GET`,并假设 p.act 是 `POST `和 `GET` > 以上表示` r.act ` 是否符合 `p.act` 的正则匹配 ![](https://img.kancloud.cn/56/2e/562ed074f3fde0fcd3088459e568e4f2_702x203.png) > SQL 语句 ``` INSERT INTO `casbin`.`casbin_rule`(`id`, `ptype`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`) VALUES (8, 'p', 'tinywan2', '/api/user', '(GET|POST|PUT|DELETE)', NULL, NULL, NULL); ``` 请求方式合并为一个 `(GET|POST|PUT|DELETE)` > 测试代码 ![](https://img.kancloud.cn/f8/20/f8206f20904897488512f49c365421a3_663x187.png) ``` var_dump(Casbin::enforce('tinywan2', '/api/user', 'GET')); echo "<hr/>"; var_dump(Casbin::enforce('tinywan2', '/api/user', 'POST')); echo "<hr/>"; var_dump(Casbin::enforce('tinywan2', '/api/user', 'PUT')); echo "<hr/>"; var_dump(Casbin::enforce('tinywan2', '/api/user', 'DELETE')); ``` > 执行结果 ![](https://img.kancloud.cn/f8/ad/f8ad03068fc19f39034d0ed16ce74327_224x197.png) > casbin-basic-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 && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act) ``` ## 方案二、自定义匹配函数 golang可以自动以,PHP待定 ## 其他 * [第1讲:开张课、最简单的例子](https://www.jtthink.com/course/play/2921) * [第2讲:结合gin做基本验证的例子(初步)](https://www.jtthink.com/course/play/2922) * [第3讲:使用Gorm持久化权限策略(初步)](https://www.jtthink.com/course/play/2923) * [第4讲:初始化权限数据:API调用、权限5张表](https://www.jtthink.com/course/play/2924) * [第5讲:初始化权限(1):角色初始化](https://www.jtthink.com/course/play/2925) * [第6讲:初始化权限(2):用户和角色初始化](https://www.jtthink.com/course/play/2956) * [第7讲:初始化权限(3):路由和角色初始化、uri参数支持](https://www.jtthink.com/course/play/2957) * [第8讲:修改匹配规则:简化策略数据](https://www.jtthink.com/course/play/2958) * [第9讲:自定义匹配函数:简化策略数据](https://www.jtthink.com/course/play/2959) * [第10讲:租户权限:基本配置和示例代码](https://www.jtthink.com/course/play/2960) * [第11讲:租户权限:租户基本权限表设计(6张表)](https://www.jtthink.com/course/play/2985) * [第12讲:租户权限:权限数据初始化、多租户访问方式](https://www.jtthink.com/course/play/2986) * [第13讲:设置超级管理员的三种方法](https://www.jtthink.com/course/play/2987) * [第14讲:策略生效范围:角色特例权限的实现](https://www.jtthink.com/course/play/3016)