第一个问题
请你解释一下如何在 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 代码片段添加到每个控制器的方法中,但是我们不需要任何额外的依赖项!
下一种方法是将控制器的所有方法 private
,并将 ACL 代码添加到控制器的 __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 代码放入父控制器中,但是我们仍然需要保持所有子控制器的方法是私有的。
解决方案是什么? 最佳实践是什么? 我应该在哪里调用 Acl 函数来决定执行允许还是不允许方法。
第二个问题
Second question is about getting role using Acl. Let's imagine that we have guests, users and user's friends. User have restricted access to viewing his profile that only friends can view it. All guests can't view this user's profile. So, here is the logic..
主要的问题是如何检测配置文件的所有者。我们只能检测执行 model 的方法 $model-> getOwner ()的 profile 的所有者,但是 Acl 不能访问 model。我们如何实现这一点?