使用 php-江南app体育官方入口

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

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

用例

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

多商户电商平台
商户1,用户1,属于管理员角色
      商品1
商户2,用户2,属于管理员角色
      商品2

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

模型

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

[request_definition]
r = sub, dom, obj, act
[policy_definition]
p = sub, dom, obj, act
[role_definition]
g = _, _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && 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)角色。

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_policy.csv文件中。

决策

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

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


require_once './vender/autoload.php';
use casbin\enforcer;
$enforcer = new enforcer('path/to/rbac_with_domains_model.conf''path/to/rbac_with_domains_policy.csv');

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

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 是没有权限的。

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云服务平台,多租户权限控制的设计一定是必不可少。多租户实现了多个租户共享相同的资源和组件,租户之间的数据隔离,具有很高的成本效益,具有很大的灵活性和可扩展性。通过就可以快速的实现的多租户权限控制模型的设计和开发。

原文:

本作品采用《cc 协议》,转载必须注明作者和本文链接
从零开发一个电商项目,功能包括电商后台、商品 & sku 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
以构建论坛项目 larabbs 为线索,展开对 laravel 框架的全面学习。应用程序架构思路贴近 laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
网站地图