上下文是一个建立在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,怎么样?然后,您可以轻松检查是否允许老师进行插入。该解决方案的另一个好处是能够提取有关整个班级的统计数据,例如平均成绩,出勤率等