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

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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这样的模数运算符.

你的第二个例子:

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

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

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

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

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

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

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

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

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

脚本宝典总结

以上是脚本宝典为你收集整理的php – 实现ACL约束,超过允许/拒绝全部内容,希望文章能够帮你解决php – 实现ACL约束,超过允许/拒绝所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。