如何在我的 Web MVC 应用程序中实现访问控制列表?第一部分/答案(ACL 实现)第二部分/答案(对象的 RBAC)附注
第一个问题
请问,您能解释一下如何在MVC中实现最简单的ACL吗?
这是在控制器中使用 Acl 的第一种方法...
<?php
class MyController extends Controller {
public function myMethod() {
//It is just abstract code
$acl = new Acl();
$acl->setController('MyController');
$acl->setMethod('myMethod');
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
这是非常糟糕的方法,它的缺点是我们必须将Acl代码段添加到每个控制器的方法中,但我们不需要任何其他依赖项!
下一种方法是制作所有控制器的方法,并将 ACL 代码添加到控制器的方法中。private
__call
<?php
class MyController extends Controller {
private function myMethod() {
...
}
public function __call($name, $params) {
//It is just abstract code
$acl = new Acl();
$acl->setController(__CLASS__);
$acl->setMethod($name);
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
它比以前的代码更好,但主要的缺点是...
- 所有控制器的方法都应该是私有的
- 我们必须将 ACL 代码添加到每个控制器的__call方法中。
下一种方法是将 Acl 代码放入父控制器中,但我们仍需要将所有子控制器的方法保密。
解决方案是什么?什么是最佳实践?我应该在哪里调用 Acl 函数来决定允许或不允许执行方法。
第二个问题
第二个问题是关于使用 Acl 获取角色。让我们想象一下,我们有客人,用户和用户的朋友。用户对查看其个人资料的权限受到限制,只有朋友才能查看。所有来宾都无法查看此用户的个人资料。所以,这是逻辑。
- 我们必须确保被调用的方法是配置文件
- 我们必须检测此配置文件的所有者
- 我们必须检测查看者是此配置文件的所有者还是没有
- 我们必须阅读有关此配置文件的限制规则
- 我们必须决定执行或不执行配置文件方法
主要问题是关于检测配置文件的所有者。我们可以检测谁是配置文件的所有者,只执行模型的方法$model->getOwner(),但 Acl 无权访问模型。我们如何实现这一点?