Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何编写和存储动态权限约束?_Php_Mysql_Web Applications_Authorization_Acl - Fatal编程技术网

Php 如何编写和存储动态权限约束?

Php 如何编写和存储动态权限约束?,php,mysql,web-applications,authorization,acl,Php,Mysql,Web Applications,Authorization,Acl,我以前已经讨论过这个问题,但还没有找到一个好的解决办法 假设我们有一个应用程序,客户可以使用该网站预订课程,管理人员也可以使用后端系统代表客户预订课程。我正在尝试建立一种方法,让人力资源管理员将应用于权限的约束(如可以预订)编成代码,因为权限不仅仅是布尔值,不应该硬编码到应用程序中 目前,客户可以进行预订,只要课程日期是未来至少“n”天的标准通知日期,他们预订的名额不超过可用名额,并且他们至少支付了到期金额(如果他们的帐户设置为发票,则为零)。经理可以使用后端应用程序预订,只要约会日期是现在之后

我以前已经讨论过这个问题,但还没有找到一个好的解决办法

假设我们有一个应用程序,客户可以使用该网站预订课程,管理人员也可以使用后端系统代表客户预订课程。我正在尝试建立一种方法,让人力资源管理员将应用于权限的约束(如
可以预订
)编成代码,因为权限不仅仅是布尔值,不应该硬编码到应用程序中

目前,客户可以进行预订,只要课程日期是未来至少“n”天的标准通知日期,他们预订的名额不超过可用名额,并且他们至少支付了到期金额(如果他们的帐户设置为发票,则为零)。经理可以使用后端应用程序预订,只要约会日期是现在之后的任何时间

我想象着这样的事情。允许HR管理员添加如下权限约束:

role      permission    constraint
--------  ------------  ----------
customer  make_booking  1
customer  make_booking  2
customer  make_booking  3
manager   make_booking  5
然后是一个约束表

constraint  property        operator  value                       OR_parent
----------  ------------    --------  --------------------------  ---------
1           $course_date    >=        strtotime("+$notice days")  NULL
2           $places_booked  <=        $places_available           NULL
3           $paid           >=        $total                      NULL
4           $send_invoice   ==        TRUE                        3
5           $course_date    >=        strtotime("now")            NULL
每个规则可以在每个阶段独立使用,例如JavaScript和表单验证,以便在由于某种原因无法预订时提供反馈

但是,假设人力资源部希望更改客户的规则,以便他们一次只能预订3个位置,并且
$paid
金额必须至少为
$deposit
金额?理想情况下,我希望允许他们动态构建这些php规则,而不允许他们访问硬编写的代码。可以对属性和值进行清理,以便
eval
ing代码不成问题。我不想硬编码每一条规则的每一个组合,因为在某些情况下,事先没有明确的方法来猜测人力资源管理员的逻辑

我看过Zend_ACL版本的,但它们似乎没有提供我所期待的活力。实现这些动态约束的好方法是什么?其他环境有什么想法吗?谢谢



Zed Shaw在CUSEC的一次演讲中谈到了为什么“ACL已经死了”

这是一个仍然引起大量讨论的领域。正如一些人所说(谁?——我想是其他人中的一个,但我想不出一个链接),一个可以做任何事情的应用程序已经被提出;它被称为C。您想要做的几乎是“过于普遍化”的领域,尽管我可以看到不需要程序员每次更改业务规则的价值

如果我必须实现这样一个系统,我想我会尝试将其分解为多个域。在第二个表中,您已经完成了相对较好的工作。只需将其标准化为用于复合业务规则的单独域。您创建的业务规则由1个或多个约束组成,或合并在一起。每个约束都需要一个属性,该属性由一个运算符限制一个项。术语可能很棘手,因为它们可以是从属性到函数,再到复合函数的任何内容。检查您的业务规则以了解您需要什么可能是最简单的。比如说,从属性、布尔值和像“现在”这样的普通事物开始

例如,模式本身将由
规则组成,这些规则包含多个
约束(明显的好处是您可以将这些约束绑定到您想要的任何[user group/offer/timespan/other domain])。它们依次由
属性
组成,这些属性将与
操作符之一
进行比较(参考表主要用于为非程序员输入自定义描述性名称,但您可以选择在其中输入自定义函数),当然还有一个
术语
。最后一部分是最复杂的部分,因此您可能必须在
term_types
中使用ID对其进行限定,以便知道您是在与其他属性还是函数进行比较。您还可以使用PHP创建字段,这应该不会太困难,因为您在
属性
和/或
函数
中有所有选项


这是一个非常开放的系统(可能有更好的方法),因此,除非您知道您需要业务规则的高度动态性,否则可能不值得这么做。

回答并加上1,因为您的评论已证明反映了其他解决方案。谢谢
if($course_date >= strtotime("+$notice days") && $places_booked <= $places_available && ($paid >= $total || $send_invoice == TRUE)){
    // make the booking
}