【发布时间】:2017-03-28 12:25:01
【问题描述】:
我正在尝试使用 Codeigniter 中的 _remap 方法创建全局身份验证。以下是访问控制器/方法的网站条件:
- 方法必须存在。
- 有些控制器只有在用户/管理员登录后才能访问。
- 某些控制器只能由管理员访问。
_remap 方法写在 MY_Controller 中,它将被继承到所有控制器。这是我的代码:
protected $must_login;
protected $must_admin;
public function _remap($method, $param = array())
{
# Check if method exist
if (method_exists($this, $method))
{
# Check whether the user has to be login to access it
if ($this->must_login)
{
# Check whether the user has logged in
if ($this->auth->is_loggedin())
{
# Check whether it has to be admin to access it
if ($this->must_admin)
{
# Check whether it is admin
if ($this->auth->is_admin())
{
# Run the method
return call_user_func_array(array($this, $method), $param);
}
else
{
# Redirecting to login form
$this->go('auth');
}
}
else
{
return call_user_func_array(array($this, $method), $param);
}
}
else
{
$this->go('auth');
}
}
else
{
return call_user_func_array(array($this, $method), $param);
}
}
else
{
$this->go('auth');
}
}
代码可以运行,但我觉得可以简化。我已经尝试过,但它总是以无限重定向结束。有没有什么办法可以简化这个方法?
提前谢谢你。
【问题讨论】:
-
我认为通过扩展 CI_Controller 会更容易实现。 SO和网络上到处都是关于如何做到这一点的例子。 CI 已经检查了一个有效的控制器和控制器/方法,如果没有找到,将 error404。您可以利用
$route['404_override']来完成与$this->go('auth');等效的操作 为什么当CI 已经有一个经过深思熟虑的完全可以接受的router时创建go类?如果您只是利用现有的框架结构,这将大大简化。 -
我同意,我认为这整个方法,虽然它可以工作,但并不是实现实际上相对微不足道的事情的最可靠、稳健或可维护的方法 - 在调用特定控制器时,是用户允许访问。这种认证可以在一条线上完成,更重要的是,这种认证的操作可以以一种更加透明的方式进行调整。恕我直言,这是重映射功能的过度工作,完全没有必要。同样,恕我直言,重新映射是边缘情况和场景、变通办法和软糖的后备方案。就我个人而言,我会避免使用它。
标签: php codeigniter class methods codeigniter-3