第一个问题
请问,您能解释一下在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!");
...
}
}
?>
Run Code Online (Sandbox Code Playgroud)
这是一个非常糟糕的方法,它的缺点是我们必须将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!"); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有一些ACL要求的Web应用程序:用户可以更改某些项目,某些项目可以由多个用户编辑,管理员可以编辑任何内容,管理员可以编辑组织内的所有内容等.
我正在使用Play!框架,以及Secure模块的外观,似乎放置授权问题的地方在控制器中.但是,在我看来,授权问题是业务逻辑的一部分,因此应该在模型中.此外,我开始看到控制器中需要重构的重复逻辑.
另一方面,向模型添加授权意味着我必须有一些方法从模型中获取当前用户,这似乎不对.或者,我可以为每个模型方法添加"current_user"参数,但这看起来更糟.
那么常见的做法是什么?可以/应该将授权代码放在模型中,还是将其保存在控制器中?