实施ACL约束,不仅仅允许/拒绝
|
我已经开发了一个小型但有效的MVC样式框架,供在应用程序中使用,并且正在实现ACL每个请求检查。
快速详细信息:PHP 5.3+; MySQL 5.1+;自定义框架,“类似于MVC”
到目前为止,ACL检查很简单,“拒绝-如果不是白名单”;可以将每个“ 0”分配给某些请求处理程序的权限。例如:
privilege permission
+----------+---------------+ +---------------+---------------+
| group_id | permission_id | | permission_id | handler_key |
+----------+---------------+ +---------------+---------------+
| 1 | 1 | | 1 | lorem_ipsum |
| 1 | 2 | | 2 | hello_world |
| 2 | 3 | | 3 | foobar |
+----------+---------------+ +---------------+---------------+
(为简洁起见,不包括user
和group
,但是它们的模型并不稀奇)
无论如何,我的框架都通过处理程序/路径表将URI路由到适当的ѭ4(以解耦文件系统体系结构),然后将给定与请求关联的ѭ5列入白名单,然后将请求分派到处理程序。
我很好奇,实现存储/检查任意(用户定义)约束的最佳方法是什么?案例示例为:
仅允许给定的组在工作日的8:00至17:00之间调用处理程序。
只允许给定的组调用处理程序来修改“拥有的”数据;即:由相关的“ 2”创建的数据。此检查可能涉及对与要由处理程序修改的内容相关联的user_id
字段以及与请求相关联的user_id
字段的检查。
我有一个“ 10”列,但是随着更多功能,组和约束要求的引入,它并不是面向未来的。我在朝以下方向思考,但是该怎么用呢?
permission
+---------------+----------------------------+
| permission_id | handler_key | constraint |
+---------------+---------------+------------+
| 1 | lorem_ipsum | ? |
| 2 | hello_world | ? |
| 3 | foobar | ? |
+---------------+---------------+------------+
不必要的澄清:
(注意:代码是在此处键入的,而不是项目中的copypasta)
在这里澄清一些行话;对于熟悉MVC原型的人,处理程序(特别是Web处理程序)本质上是控制器。
它们的特定实现是单个PHP文件,该文件返回要由调度程序或子处理程序调用程序调用的函数。例如:
<?php
$meta = array(\'subhandlers\' => array());
return function($request, $response) use($meta){
$response[\'foo\'] = \'bar\';
};
我的框架使用Web处理程序和API处理程序。 Web处理程序将数据馈入到生成HTML的响应对象(基本上是分层视图的集合)中。数据是通过调用API处理程序获得的,这些处理程序仅返回原始数据(API处理程序可以视为模型的表示形式,可以回到典型的MVC)。
复合处理程序本质上是一个抽象层,因为它们本身是处理程序,它们调用处理程序以聚合数据。我当前的ACL检查实现对所有嵌套处理程序进行粗略检查(通过$meta
,这是一个声明为充当处理程序元数据标头的数组变量),例如:
<?php
$meta = array(\'subhandlers\' => array(\'my_subhandler\'));
return function($request, $response) use($meta){
$someData = Caller::call(\'my_subhandler\', array($request, $response));
$response->bind($someData);
};
没有找到相关结果
已邀请:
2 个回复
屑凉赦
细瑞
样式请求处理方法。 (请以批判和/或嘲笑和/或高五级作为主张) 为此,可以将检查用户是否具有权限的请求仅视为另一个请求,因此需要它自己的处理程序。例如:
通过添加一个
-able
列,可以以编程方式创建新约束并进行管理委派。 当请求触发时,框架将聚合处理程序链,并将其与白名单进行比较,就像已经做的那样。如果存在“ 18”(可能带有上表所示的参数),它将在与该请求类型相关联的“ 20”中进行查找:
(API处理程序也相同) 预期ACL处理程序仅返回布尔值,从而继续或结束权限检查序列,从而整个或整个请求。
遗漏18英镑的情况作为基本白名单检查处理;允许/否。 因此,我的应用程序目录将开始如下所示: