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

使用 PHP

2025-07-27 19:28:50
使用 PHP 多租户(multi-tenancy)是一种软件架构技术,是实现在多租户的环境下共用相同的系统或程序组件,并且保证各用户间的数据隔离,也可称作域租户。PHP-Casbin 不仅提供了全局的RBAC的权限模型,而且还支持特定域的权限模型。特定租户/域的角意味着当用户在不同的租户/域中时,用户可以拥有不同的角,亦拥有不同的权限策略。在大型项目中,特别是在像SaaS PaaS这种云服务中

使用 PHP

多租户(multi-tenancy)是一种软件架构技术,是实现在多租户的环境下共用相同的系统或程序组件,并且保证各用户间的数据隔离,也可称作域租户

PHP-Casbin 不仅提供了全局的RBAC的权限模型,而且还支持特定域的权限模型。特定租户/域的角意味着当用户在不同的租户/域中时,用户可以拥有不同的角,亦拥有不同的权限策略。在大型项目中,特别是在像SaaS PaaS这种云服务中,不同的租户需要拥有独立的权限控制,这就非常有用。

用例

这里我以一个多商户的电商平台为例,电商平台的商户就是租户,每个商户有自己的管理人员,可以分配不同的角,定义自己的权限。这些商户间的数据在逻辑上是完全隔离的,但他们共享这个电商平台的其他资源。

代码语言:ini复制
多商户电商平台

商户1,用户1,属于管理员角
      商品1

商户2,用户2,属于管理员角
      商品2

如上述,在这个电商平台下,每个商户就是一个租户,在每个商户下面有用户和商品。这些用户和商品是相互隔离的,并且在每个商户下面都有一套独立的权限控制系统。

模型

在官方仓库中提供了多租户的模型配置,rbac_with_domains_:

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

[policy_definition]
p = sub, dom, obj, act

[role_definition]
g = _, _, _

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

[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom &&  ==  && r.act == p.act

通过上面的模型配置,可以看出,相比普通的RBAC模型,它多了一个dom参数,这个dom就是上文所说的商户(domain)。

[role_definition]g = _, _, _,有三个占位符,分别代表:用户租户/域

[matchers]中的g(r.sub, p.sub, r.dom)就是判断用户租户/域之间的关系。

策略

根据上面的用例要求,下面分别定义了商户1(tenant1)和商户2(tenant2)的管理员权限策略,并且在各自的租户下赋予了user1user2的管理员(admin)角。

代码语言:csv复制
p, admin, tenant1, goods1, read
p, admin, tenant1, goods1, write

p, admin, tenant2, goods2, read
p, admin, tenant2, goods2, write

g, user1, admin, tenant1
g, user2, admin, tenant2

上面的策略配置在rbac_with_domains_文件中。

决策

如果你的项目还有没有引入Casbin依赖,则需要安装一下,通过composer require casbin/casbin

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

代码语言:php复制
<?php

require_once './vender/autoload.php';

use Casbin\Enforcer;

$enforcer = new Enforcer('path/to/rbac_with_domains_', 'path/to/rbac_with_domains_');

上面实例化了一个决策器(Enforcer),首先,来验证一下商户1下用户的权限:

代码语言:php复制
var_dump(
    $enforcer->enforce('user1', 'tenant1', 'goods1', 'read'), // true
    $enforcer->enforce('user1', 'tenant1', 'goods1', 'write'), // true
    $enforcer->enforce('user1', 'tenant2', 'goods2', 'read'), // false
    $enforcer->enforce('user1', 'tenant2', 'goods2', 'write'), // false
);

可以看出,在商户1 下,用户1 对商品1 拥有readwrite的,但他对商户2 下的商品是没有权限的。

同样,下面验证商户2 的权限,在商户2 下,用户2 对商品2 有权限,而对商户1 是没有权限的。

代码语言:php复制
var_dump(
    $enforcer->enforce('user2', 'tenant1', 'goods1', 'read'), // false
    $enforcer->enforce('user2', 'tenant1', 'goods1', 'write'), // false
    $enforcer->enforce('user2', 'tenant2', 'goods2', 'read'), // true
    $enforcer->enforce('user2', 'tenant2', 'goods2', 'write'), // true    
);
最后

假设你正在开发一个面向企业的SaaS云服务平台,多租户权限控制的设计一定是必不可少。多租户实现了多个租户共享相同的资源和组件,租户之间的数据隔离,具有很高的成本效益,具有很大的灵活性和可扩展性。通过PHP-Casbin就可以快速的实现的多租户权限控制模型的设计和开发。

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

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

相关标签:无
上传时间: 2025-07-21 22:51:31
留言与评论(共有 13 条评论)
本站网友 心一跳爱就开始煎熬
30分钟前 发表
但他对商户2 下的商品是没有权限的
本站网友 wuhandaxue
27分钟前 发表
如果是在Laravel
本站网友 phpwind
5分钟前 发表
goods2
本站网友 z170
11分钟前 发表
相比普通的RBAC模型
本站网友 上下杭美食
17分钟前 发表
具有很大的灵活性和可扩展性
本站网友 房屋产权证办理流程
7分钟前 发表
代码语言:ini复制[request_definition] r = sub
本站网友 puremvc
30分钟前 发表
租户/域
本站网友 房颤怎么治疗
25分钟前 发表
首先
本站网友 41122
22分钟前 发表
是实现在多租户的环境下共用相同的系统或程序组件
本站网友 定时开机
26分钟前 发表
电商平台的商户就是租户
本站网友 立体仓库
0秒前 发表
这是演示的是纯原生PHP代码
本站网友 win7优化
5分钟前 发表
tenant1