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


How to implement a permissions system that varies according to the values a user is attempting to save?

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

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

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

{ achievement: "4", performance: "5", student_id: "10" }

问题在于,导师只允许对student_ids的某个子集(他们正在教的学生(创建新报告。

一种方法是将此视为该领域的验证问题。这样做的问题是,我们希望保护自己不犯错误,而这在验证中并不容易做到(代码必须事先知道在某些字段上需要特殊验证(。

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

if ($acl->isAllowed($resource, $role, $action, $field, $value))

其中$resource是报告模型,$role是教师teacher_5$action是"帖子",$field是student_id,$value是10。acl 类本质上将处理对$resource本身的调用。

我们不确定该采取哪个方向,但大概这是一个相当普遍的问题,所以我们想知道其他人采取了什么方法。

如果再有一张表,里面有每位老师辅导student_id,怎么样?然后,您可以轻松检查是否允许老师进行插入。该解决方案的另一个好处是能够提取有关整个班级的统计数据,例如平均成绩,出勤率等