任务是保护呼叫公共控制器的方法;我们需要在打电话之前检查用户是否是管理员。
class AdminController {
final public function __call($name, $arguments) {
if (!Auth::isAuth()) {
$User = UserFactory::loadById(Auth::getUserId());
if (!$User->isAdmin()) {
throw new ForbiddenException();
}
}
return call_user_func_array(array($this, $name), $arguments);
}
}
class AdminCategoryController extends AdminController {
public function view() { //__call() won't be called bacause it is public method
}
}
我们可以使用魔术__call()
方法,但我们需要所有方法private
。
我看到的另一种方法是在final public __construct()
定义AdminController
并在那里检查$ User-> isAdmin()...
还有其他想法吗?
谢谢。
答案 0 :(得分:1)
在基本控制器(BaseController
)中创建一个名为isSecure()
的新方法:
public function isSecure() {
return false;
}
然后在您的控制器中必须安全(AdminBaseController
)覆盖方法:
public function isSecure() {
return true;
}
AdminBaseController
延伸BaseController
,AdminCategoryController
应延长AdminBaseController
。
然后,您可以随时在任何控制器上调用$Controller->isSecure()
,以确定它是否必须安全。
因此,在您的调度代码中,您可以使用类似的东西(显然需要重构):
if($Controller->isSecure()) {
if (!Auth::isAuth()) {
$User = UserFactory::loadById(Auth::getUserId());
if (!$User->isAdmin()) {
throw new ForbiddenException();
}
} else {
$Controller->view();
}
}