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之间调用处理程序. 我有一个标志列,但随着更多功能,组和约束要求的引入,这不是面向未来的.我正在考虑以下方向,但要使用什么? 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) 如果你有一个propper符号,你可以很容易地解析并验证tokenizing规则,并可能使用某些东西DatePeriod或DateInterval甚至像crontab这样的模数运算符. 你的第二个例子:
对我来说听起来像普通的ACL: >资源:特定数据 当然,你有更复杂的规则,如:
我认为这种规则必须特定于应用程序逻辑,并且真正的通用解决方案将非常难以实现,Zed Shaw在他的演讲中提到他提出了一个只使用400行代码的完整解决方案,我会非常有兴趣了解他是如何做到的. 标志(存储在位中)是指定一个或多个约束的组合的一种很好的(虽然是神秘的)方式,但根据我的经验,如果你定义所有约束apriori更好. 由于您似乎并不确切地知道要检查的约束,因此我建议您为要检查的几种类型的限制创建符号: >基于时间 然后实现解析的方法(可能带有暗示版本的符号,以便将来可以迁移)并验证所有约束. 我很抱歉,如果我的答案对你没什么帮助,但我觉得这个问题很有意思,我希望别人能找到一个更好的答案,AFAIK没有魔术棒可以做到这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |