【发布时间】:2011-09-02 03:51:01
【问题描述】:
我已经开发了一个小而有效的 MVC 风格框架,用于应用程序,并且我正在实现一个 ACL 每个请求的检查。
快速细节:PHP 5.3+; MySQL 5.1+;自定义框架,“类似 MVC”
到目前为止,ACL 检查很简单“deny-if-not-white-listing”;每个group 都可以分配给某些请求处理程序的权限。例如:
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 路由到适当的 handler_key(以解耦文件系统架构)然后将请求分派到处理程序,给定 group_id 关联该请求被列入该handler_key 的白名单。
我很好奇,实现存储/检查任意(用户定义)约束的最佳方法是什么?示例如下:
- 仅允许给定组在工作日的 8:00 到 17:00 之间调用处理程序。
- 只允许给定组调用处理程序来修改“拥有”数据;即:由关联的
user创建的数据。 此检查可能涉及检查与要由处理程序修改的内容相关联的user_id字段,以及与请求相关联的user_id
我有一个flags 列,但是随着更多功能、组和约束要求的引入,这并不是面向未来的。我在想下面的方向,但是用什么?
permission
+---------------+----------------------------+
| permission_id | handler_key | constraint |
+---------------+---------------+------------+
| 1 | lorem_ipsum | ? |
| 2 | hello_world | ? |
| 3 | foobar | ? |
+---------------+---------------+------------+
不必要的澄清:
(注意:这里输入的是代码,而不是项目中的copypasta)
在这里澄清一些行话; handlers(特别是 web handlers)本质上是 controllers,对于那些熟悉 MVC 原型的人来说。
它们的具体实现是一个单独的 PHP 文件,它返回一个要由调度程序或子处理程序调用者调用的函数。例如:
<?php
$meta = array('subhandlers' => array());
return function($request, $response) use($meta){
$response['foo'] = 'bar';
};
我的框架使用 web 处理程序 和 API 处理程序; Web 处理程序将数据输入响应对象(基本上是分层视图的集合),该对象生成 HTML。数据是通过调用API处理程序获得的,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);
};
【问题讨论】:
-
您可能会觉得这很有趣:vimeo.com/2723800(ACL 已死)。
-
感谢 Alix Axel;有趣的视频,我略读了一下,稍后我会完整观看;至于wiki条目,我以前读过它,它让我的大脑渗透,但我正在寻找解决方案。我会全力以赴学习如何钓鱼,但现在,我只需要吃一天。
标签: php model-view-controller permissions constraints acl