Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Zend Framework_User Permissions - Fatal编程技术网

Php 如何实现根据用户试图保存的值而变化的权限系统?

Php 如何实现根据用户试图保存的值而变化的权限系统?,php,oop,zend-framework,user-permissions,Php,Oop,Zend Framework,User Permissions,上下文是建立在Zend框架上的教育管理系统。我们正在实现一个RESTful MVC来处理几乎所有与客户机的数据交互。资源之间的关系用外键等映射到数据库中 示例案例:教师创建关于特定学生的报告 我们目前有一个基于角色的权限系统,可以根据个人角色的级别进行定制(例如,使用teacher_5作为角色名称)。因此,我们可以很容易地限制对已经存在的报告的访问(通过在报告模型中生成权限,只允许创建报告的导师角色对报告进行编辑/放置权限)。问题在于创造。为了添加报告,用户可以将以下数据发布到/报告: { ac

上下文是建立在Zend框架上的教育管理系统。我们正在实现一个RESTful MVC来处理几乎所有与客户机的数据交互。资源之间的关系用外键等映射到数据库中

示例案例:教师创建关于特定学生的报告

我们目前有一个基于角色的权限系统,可以根据个人角色的级别进行定制(例如,使用
teacher_5
作为角色名称)。因此,我们可以很容易地限制对已经存在的报告的访问(通过在报告模型中生成权限,只允许创建报告的导师角色对报告进行编辑/放置权限)。问题在于创造。为了添加报告,用户可以将以下数据发布到/报告:

{ achievement: "4", performance: "5", student_id: "10" }
问题是,教师只允许对他们正在教学的学生ID的某个子集创建新报告

一种方法是将其视为该领域的验证问题。这样做的问题是,我们希望保护自己不犯错误,而这对于验证来说并不容易(代码必须事先知道特定字段上需要进行特殊验证)

另一种方法是以某种方式将我们的权限系统扩展到一个完全细粒度的系统(即,每个模型中的每个字段都有一个权限),然后将我们当前的权限系统扩展到响应参数化权限检查。因此,如果我们想知道当前用户是否有权将student_id 10添加到创建报告中,我们最终会得到如下结果

if ($acl->isAllowed($resource, $role, $action, $field, $value))
其中,$resource将是一个报告模型,$role将是教师
teacher\u 5
$action
将是“post”,$field将是
student\u id
,而$value将是10。acl类基本上会处理对
$resource
本身的调用


我们不确定该朝哪个方向走,但这可能是一个相当普遍的问题,因此我们想知道其他人采取了什么方法。

另一张包含每位教师辅导的学生id的表格怎么样。然后你可以很容易地检查老师是否被允许做插入。该解决方案的另一个好处是能够提取全班的统计数据,如平均成绩、出勤率等

您看过了吗?我在像您这样的情况下使用这些方法,在这种情况下,授予/拒绝访问涉及到更复杂的逻辑。那可能就是你要找的。德鲁010:那就是我要用的;)谢谢@drew010。我刚才确实看过了。。。我想我放弃了它,因为我目前正在使用默认的资源对象。我的想法是让我的模型实现Zend_Acl_Resource_接口,然后在断言本身中,我将从模型中提取相关细节并在那里实现逻辑吗?而且,断言只有在返回true时才适用,因此我必须为每个操作添加单独的deny和allow规则。但是在这种情况下,哪一个优先呢?话虽如此,我想断言规则可以简单地代理到模型上的isAllowed方法,允许规则将返回isAllowed,而拒绝规则返回isAllowed!我被允许了,这样就不会有混乱了。@kasimir对于给定的案例来说,这可能有点棘手,但我已经用断言做了一些有趣的事情。您甚至可以在没有定义角色或资源的情况下使用断言,正如ZF手册上的
CleanIP_断言所示。我不是100%确定,但我相信只有当角色能够访问请求的资源和特权时,才会测试断言,因此,如果这些都不是真的,就没有必要测试断言。基本上,我使用断言来更深入地查看登录用户(无论角色如何),并使用断言来确定用户是否可以