isAuthorized()与在CakePHP中使用Acl组件有什么区别?

isAuthorized()与在CakePHP中使用Acl组件有什么区别?,php,cakephp,authorization,cakephp-2.1,Php,Cakephp,Authorization,Cakephp 2.1,我还是个蛋糕新手。 假设您有一个具有组id的表users和一个名为groups的表 小组: id角色 1管理员 2教师 3名学生 我想知道,例如,使用isAuthorized函数授权用户访问某个操作和使用Acl限制用户访问之间的区别是什么?一种方法比另一种更安全吗 此外,我想知道是否有任何“Cakish”的方法来实现,例如: -允许管理员访问编辑操作 -允许学生访问编辑操作,但限制他更改某个字段 例如,假设一名学生正在编辑具有以下字段的表用户:用户名、密码、组id。他可以编辑密码,但不能编辑

我还是个蛋糕新手。 假设您有一个具有组id的表users和一个名为groups的表 小组:

  • id角色
  • 1管理员
  • 2教师
  • 3名学生
我想知道,例如,使用isAuthorized函数授权用户访问某个操作和使用Acl限制用户访问之间的区别是什么?一种方法比另一种更安全吗

此外,我想知道是否有任何“Cakish”的方法来实现,例如: -允许管理员访问编辑操作 -允许学生访问编辑操作,但限制他更改某个字段

例如,假设一名学生正在编辑具有以下字段的表用户:用户名、密码、组id。他可以编辑密码,但不能编辑组id和用户名。而管理员可以编辑两者。我实现这一点的方法是在用户发布其组id后,在控制器内部进行检查,并根据其权限取消设置字段用户名和组id。这是一种正确的实施方式吗

谢谢。

ACL(或访问控制列表)是一种从代码中分离谁有权访问什么的逻辑的方法。使用isAuthorized()时,必须手动为每种可能的访问类型添加代码。此外,ACL允许(递归)分组和矩阵式访问(如“允许访问所有战士,但不允许访问小精灵种族的战士”);CakePHP的文档非常丰富

然而,我个人发现Cake的ACL中缺少的是限制对特定项目的访问。例如,一个学生可以查看他的成绩,但不能查看其他学生的成绩;i、 e.他可以调用/results/view/10、/results/view/49和/results/view/87,但不能调用其他命令。我无法使用ACL执行此操作

至于编辑:显示/发布所有数据,然后删除您认为不必要的内容通常是个坏主意。总有一天你会忘记一个字段,然后你就会有一个bug或漏洞。我建议使用安全组件来防止表单篡改,然后根据访问级别,仅将用户可以编辑的字段添加到表单中


CakePHP文档告诉您在控制器的POST操作中手动添加要保存的字段,但这意味着您必须在两个位置维护字段列表:在窗体视图中和控制器中。添加代码以根据访问级别包含/排除字段,您会遇到维护难题。使用安全防篡改功能,用户无法手动添加字段来操作帖子数据。

谢谢@JvO,这非常有帮助!