Php 控制呼叫控制器';s的公共方法,可能吗?
任务是保护调用公共控制器的方法;在打电话之前,我们需要检查用户是否是管理员Php 控制呼叫控制器';s的公共方法,可能吗?,php,Php,任务是保护调用公共控制器的方法;在打电话之前,我们需要检查用户是否是管理员 class AdminController { final public function __call($name, $arguments) { if (!Auth::isAuth()) { $User = UserFactory::loadById(Auth::getUserId()); if (!$User->isAdmin()) {
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
}
}
我们可以使用magic\uu call()
方法,但我们需要所有方法都是私有的
我看到的另一种方法是在AdminController
中定义final public\uu construct()
,并将checking$User->isAdmin()放在那里
还有其他想法吗
谢谢。在基本控制器(
BaseController
)中创建一个名为isSecure()
的新方法:
然后,在必须安全的控制器中(AdminBaseController
)使用以下命令覆盖该方法:
public function isSecure() {
return true;
}
AdminBaseController
扩展BaseController
和AdminCategoryController
应扩展AdminBaseController
然后,您可以随时在任何控制器上调用$Controller->isSecure()
,以确定它是否必须是安全的
因此,在分派代码中,您可以使用如下内容(显然需要重构):
为什么我们需要实现
isSecure
方法?作为AdminController
=所有方法都被安全调用。如果我没有为Admin/Public设置单独的控制器,那么实现isSecure()
方法是可以的。顺便说一句,在我看来,最好在根控制器上定义isSecure
,然后在每个子控制器上定义constanctisu\u SECURE
。因此,您的调度代码可以在调用控制器之前进行检查。如果用户未经授权,您的调度员应将用户引导至InvalidLoginController
或类似的机构,而不是*AdminController
。你在评论的时候,我在稍微修改我的答案。我建议您在调度代码中捕获未经身份验证的用户,级别比控制器高。啊哈,我明白了。因此,在dispatcher中检查isCallable将允许我们实现功能齐全的ACL。伟大的
public function isSecure() {
return true;
}
if($Controller->isSecure()) {
if (!Auth::isAuth()) {
$User = UserFactory::loadById(Auth::getUserId());
if (!$User->isAdmin()) {
throw new ForbiddenException();
}
} else {
$Controller->view();
}
}