php – 实现ACL约束,超过允许/拒绝

前端之家收集整理的这篇文章主要介绍了php – 实现ACL约束,超过允许/拒绝前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经开发了一个用于应用程序的小而有效的MVC样式框架,我正在实现ACL每请求检查.

快速详细信息:PHP 5.3; MysqL 5.1;自定义框架,“类似MVC”

截至目前,ACL检查很简单“deny-if-not white-listing”;可以为每个组分配对某些请求处理程序的权限.例如:

privilege                       permission
+----------+---------------+    +---------------+---------------+
| group_id | permission_id |    | permission_id | handler_key   |
+----------+---------------+    +---------------+---------------+
|     1    |       1       |    |       1       | lorem_ipsum   |
|     1    |       2       |    |       2       | hello_world   |
|     2    |       3       |    |       3       | foobar        |
+----------+---------------+    +---------------+---------------+

(为简洁起见,用户和组排除在外,但他们的模型并不罕见)

无论如何,我的框架通过处理程序/路径表将URI路由到相应的handler_key(以解耦文件系统体系结构)然后,如果与请求关联的group_id为该handler_key列入白名单,则将请求分派给处理程序.

我很好奇,实现存储/检查任意(用户定义)约束的最佳方法是什么?案例将是:

>仅允许给定的组在工作日的8:00到17:00之间调用处理程序.
>仅允许给定组调用处理程序来修改“拥有”数据;即:由关联用户创建的数据.该检查可能涉及检查与处理程序要修改内容相关联的user_id字段,以及与请求相关联的user_id

我有一个标志列,但随着更多功能,组和约束要求的引入,这不是面向未来的.我正在考虑以下方向,但要使用什么?

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处理程序只返回原始数据(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);
    };
我在评论中发布的视频与您分享的视频有一些类似的想法,但没有代码.

关于你的问题,我从来没有实现过这个问题,而且我对于如何构建这样的系统只能有一个模糊的想法,所以我的输入带有一些(或几个)粒子.

您必须做的第一件事是确定用户可以限制的约束,忘记任意数据,定义用户可以和不能定义的内容是最重要的一点.

下一步是定义某种您可以轻松解析和验证的符号或数据结构,例如,基于时间的限制,您有以下可能性:

>具体日期时间(2011-05-26)
>日期时间范围(2011-05-26至2011-05-31)
>递归日期时间(201x-05-26或每周五)
>逻辑(和/或/ xor)运算符

如果你有一个propper符号,你可以很容易地解析并验证tokenizing规则,并可能使用某些东西DatePeriodDateInterval甚至像crontab这样的模数运算符.

你的第二个例子:

Only permit the given group to invoke
a handler to modify “owned” data; ie:
data created by the associated user.

对我来说听起来像普通的ACL:

>资源:特定数据
>角色:特定用户

当然,你有更复杂的规则,如:

The user who approves the record must
have an equal or higher level (in the
same security namespace) as the user
who created the record,but they can’t
be the same user.

我认为这种规则必须特定于应用程序逻辑,并且真正的通用解决方案将非常难以实现,Zed Shaw在他的演讲中提到他提出了一个只使用400行代码的完整解决方案,我会非常有兴趣了解他是如何做到的.

标志(存储在位中)是指定一个或多个约束的组合的一种很好的(虽然是神秘的)方式,但根据我的经验,如果你定义所有约束apriori更好.

由于您似乎并不确切地知道要检查的约束,因此我建议您为要检查的几种类型的限制创建符号:

>基于时间
>基于用户/资源
> ……

然后实现解析的方法(可能带有暗示版本的符号,以便将来可以迁移)并验证所有约束.

我很抱歉,如果我的答案对你没什么帮助,但我觉得这个问题很有意思,我希望别人能找到一个更好的答案,AFAIK没有魔术棒可以做到这一点.

猜你在找的PHP相关文章