第一个问题
请,请您说明一下如何在MVC中实现最简单的ACL。
这是在Controller中使用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代码添加到每个控制器的__call方法中。
下一种方法是将Acl代码放入父Controller,但是我们仍然需要将所有子Controller的方法保持私有。
解决办法是什么?最佳实践是什么?我应该在哪里调用Acl函数来决定允许或禁止执行方法。
第二个问题
第二个问题是关于使用Acl的角色。假设我们有客人,用户和用户的朋友。用户具有查看其个人资料的访问权限,只有朋友可以查看。所有访客都无法查看该用户的个人资料。所以,这是逻辑。
- 我们必须确保被调用的方法是配置文件
- 我们必须检测此个人资料的所有者
- 我们必须检测出查看者是此配置文件的所有者还是否
- 我们必须阅读有关此配置文件的限制规则
- 我们必须决定执行或不执行配置文件方法
主要问题是关于检测配置文件的所有者。我们可以仅执行模型的方法$ model-> getOwner()来检测谁是配置文件的所有者,但Acl没有访问模型的权限。我们如何实现呢?
我希望我的想法是明确的。对不起我的英语不好。
谢谢。
if($user->hasFriend($other_user) || $other_user->profileIsPublic()) $other_user->renderProfile()
(否则,显示“您无权访问此用户的个人资料”或类似的话?我听不懂。)