上下文是基于Zend Framework构建的教育管理系统。我们正在实现一个RESTful MVC来处理几乎所有与客户端的数据交互。资源之间的关系使用外键等映射到数据库中。
示例案例:教师为特定学生创建报告。
我们目前有一个基于角色的权限系统,可以根据个人角色的级别进行定制(例如,使用teacher_5
作为角色名称)。因此,我们可以轻松地限制对现有报告的访问(通过在报告模型中生成权限,允许仅对创建报告的教师角色编辑/放置权限,比如说)。问题来自于创造。为了添加报告,用户可以发布/报告以下数据:
{ achievement: "4", performance: "5", student_id: "10" }
问题是导师只能在student_ids
的某个子集上创建新的报告 - 那些他们正在教学的学生。
一种方法是将此视为该领域的验证问题。这个问题是我们想要保护自己不犯错误,这对于验证来说并不容易(代码必须提前知道某些字段需要进行特殊验证)。
另一种方法是以某种方式将我们的权限系统扩展到一个完全精细的系统(即,每个模型中的每个字段都有权限),然后扩展我们当前的权限系统以响应参数化的权限检查。因此,如果我们想知道当前用户是否有权将student_id 10添加到创建报告中,我们最终会得到类似
的内容if ($acl->isAllowed($resource, $role, $action, $field, $value))
其中$资源是报告模型,$ role将是教师teacher_5
,$action
将是“post”,$ field将是student_id
,$ value将是10. acl类基本上处理对$resource
本身的调用。
我们不确定要采取哪个方向,但可能这是一个相当普遍的问题,所以我们想知道其他人采取了什么方法。
答案 0 :(得分:0)
如果有另一个包含每个教师辅导员的student_id的表格呢?然后,您可以轻松检查是否允许教师进行插入。该解决方案的另一个好处是能够提取整个班级的统计数据,如平均成绩,出勤率等