2016-08-20 71 views
0

我; m在codeigniter項目上工作。我想創建一個鉤子,以便在每次加載類時驗證用戶登錄。 我的鉤重定向你太多次了。在codeigniter鉤子

$hook['post_controller_constructor'] = array(
     'class' => 'Auth_login', 
     'function' => 'is_logged_in', 
     'filename' => 'Auth_login.php', 
     'filepath' => 'hooks', 
); 

,並在配置文件中同時啓用。

/** 
* Auth_login 
*/ 
class Auth_login 
{ 
    /** 
    * loading the CI instance 
    * @var [object] 
    */ 
    private $CI; 

    public function __construct() 
    { 
     $this->CI =& get_instance(); 
     $this->CI->load->library('session'); 
     $this->CI->load->helper('url'); 
    } 

    /** 
    * Check the enduser for login verify, every time when the enduser 
    * loads the controller. 
    */ 
    public function is_logged_in() 
    { 
     /** 
     * if end user is not logged in, redirect to the login page 
     */ 
     if(!$this->CI->session->userdata('is_logged_in')) 
     { 
      $this->CI->session->set_tempdata('faliure','Please sign in to continue'); 
      redirect(site_url('login/index')); 
     } 
    } 
} 

它檢查最終用戶的會話登錄驗證。如果用戶未登錄,則重定向到登錄頁面。 這是我控制它重定向

class Login extends CI_Controller { 
    // class constructor 
    // public function __construct() { 
    //  parent::__construct(); 
    //   // load default 
    //  $this->load->model('login_model'); 
    // } 

    /** 
    * [display the login page, and verify the login page using "form_validation" for server side validation] 
    * @return [redirect] [description] 
    */ 
    public function index() 
    { 
     $this->load->model('login_model'); 
     // on form sumbit 
     $on_sumbit = $this->input->post('verify'); 
     if(isset($on_sumbit)) 
     { 
      // server side validation for login 
      if ($this->form_validation->run('login/login_verify') == FALSE) 
      { 
       $this->load->view('login'); 
      } 
      else 
      { 
       // get the form post value 
       $user_name = $this->input->post('user_name'); 
       $password = $this->input->post('password'); 
       // verify login 
       $verified = $this->login_model->login_verify($user_name,$password); 
       if($verified) // success 
       { 
        redirect('dashboard'); 
       } 
       else // failure 
       { 
        $this->session->set_flashdata('login_failure','Please check your email and password and try again'); 
        redirect('login/index'); 
       } 
      } 
     } 
     // login page 
     $this->load->view('login'); 
    } 

    // delete active session 
    public function logout() 
    { 
     $this->session->sess_destroy(); 
     redirect('login'); 
    } 
} 

當重定向到登錄控制器,它表現出像 錯誤,因爲它工作在本地系統 的「本地主機重定向你太多次」 是什麼與此有關的實際問題。任何幫助,將不勝感激。

+0

ü可以嘗試這樣的事情樣品 **重定向(「/ index.php文件/ it_inventory/get_users」,「刷新」); ** –

+0

我在上文添加'刷新'作爲第二個參數..在你現在遇到這個問題的所有重定向中添加它。 –

+0

我也嘗試過,它會遞歸地刷新頁面。它不會加載頁面..任何其他解決方案..請 – Rakesh

回答

0

您想檢查您是否登錄控制器,或者換言之,您希望在除登錄以外的每個控制器上都具有掛鉤功能,如果條件不符合,您將重定向。您可以排除條件控制器是這樣的:

/** 
* Auth_login 
*/ 
class Auth_login 
{ 
    /** 
    * loading the CI instance 
    * @var [object] 
    */ 
    private $CI; 

    public function __construct() 
    { 
     $this->CI =& get_instance(); 
     $this->CI->load->library('session');//working with sessions - you want sessions 
     //to be loaded ASAP so better way would be having it in 
     //APPPATH.'config/autoload.php' instead in all classes 

     /** 
     * @tutorial how to exclude hook interaction with particular class/controller 
     */ 
     if (strtolower($this->CI->router->class) == 'login') 
     { 
      return; 
     } 

     $this->CI->load->helper('url'); 
    } 

    /** 
    * Check the enduser for login verify, every time when the enduser 
    * loads the controller. 
    */ 
    public function is_logged_in() 
    { 
     /** 
     * if end user is not logged in, redirect to the login page 
     */ 
     if(!$this->CI->session->userdata('is_logged_in')) 
     { 
      $this->CI->session->set_tempdata('faliure','Please sign in to continue'); 
      redirect(site_url('login/index')); 
     } 
    } 
}