【问题标题】:Is there any way to simplify this global authentication in codeigniter?有什么方法可以简化 codeigniter 中的这种全局身份验证吗?
【发布时间】:2017-03-28 12:25:01
【问题描述】:

我正在尝试使用 Codeigniter 中的 _remap 方法创建全局身份验证。以下是访问控制器/方法的网站条件:

  1. 方法必须存在。
  2. 有些控制器只有在用户/管理员登录后才能访问。
  3. 某些控制器只能由管理员访问。

_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


【解决方案1】:

我的偏好通常是将检查权放在构造函数中,然后用 $this-> 返回用户或管理员

function __construct()
{

    parent::__construct();

    if (!$this->user = $this->users->returnUser())
    {
        redirect("userlogin");
    }

} 

然后 $this->user 现在可用于您的控制器调用的所有内容 - 模型和视图:

echo 'Hello ' . $this->user->first_name . ' ' . $this->user->last_name ; 

那么假设您有管理员和超级管理员。您不必检查 - 此管理员是否有权访问此控制器?您可以在每个控制器构造函数中使用单独的检查:

    if (!$this->admin = $this->admins->returnAdmin())
    {
        redirect("adminlogin");
    }

// Or 
    if (!$this->superAdmin = $this->superadmins->returnSuperAdmin())
    {
        redirect("superadminlogin");
    }

这也清楚地分离了您要重定向到的位置,以便他们可以转到正确的登录页面。最后,当您查看控制器代码时,它可以让您快速了解 - 在页面顶部,您将立即知道什么样的用户应该可以访问它。需要考虑的事情 - 强烈建议您不要在视图文件中检查登录或管理员状态。创建更多的视图文件要安全得多。您的视图文件不应该负责确定某人是否已登录。因此,基本上,一旦您确定了构造函数中的查看器状态 - 就是这样,您无需再次检查,直到下一次控制器调用。

【讨论】:

  • 很高兴它有帮助!另外,如果可以,请单击复选标记“接受此答案”,然后它将关闭此线程。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2019-02-04
  • 2011-10-22
相关资源
最近更新 更多