有没有办法在codeigniter中简化这种全局身份验证?

时间:2016-11-14 19:04:09

标签: php codeigniter class methods codeigniter-3

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

  1. 方法必须存在。
  2. 只有用户/管理员登录后才能访问某些控制器。
  3. 某些控制器只能由管理员访问。
  4. _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');
      }
    }
    

    代码正在运行,但我觉得它可以简化。我试过但它总是以无限重定向结束。有没有办法简单地使用这种方法?

    提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

function __construct()
{

    parent::__construct();

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

} 

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

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

然后让我们说你有Admins和Superadmin。您无需检查 - 此管理员是否可以访问此控制器?您可以在每个控制器构造函数中使用单独的检查:

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

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

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