2012-06-13 88 views
1

我有一个回调函数,检查我的登录细节是否正确 - 如果他们错了,它会返回一个错误(这工作正常)。如果细节正确,它应该设置会话$this->session->set_userdata('logged_in',TRUE);,然后继续使用功能login并重定向到仪表板 - 此重定向工作正常。Codeigniter会话返回310重定向

在我function index(){}上的任何信息板页面也行

if($this->session->userdata('logged_in')) redirect('dashboard/home');

上面的线是一个引起我的310重定向,但我不确定为什么?

我想检查用户登录重定向到dashboard/home否则返回到登录页面home/login

控制器:

class Home extends CI_Controller { 

    function __construct() { 
      parent::__construct(); 
     }  

    public function index() 
    { 
     //if($this->session->userdata('logged_in')) redirect('dashboard/home'); 

     $data['contentMangement'] = $this->options_model->systemOptions(); 
     $data['pageTitle'] = 'Login'; 
     $data['message'] = ""; 
     $this->load->view('_assets/header', $data); 
     $this->load->view('login', $data); 
     $this->load->view('_assets/footer'); 
    } 

    public function login() { 
      $this->form_validation->set_rules('userEmail','Username', 'required|valid_email|trim|max_length[99]|xss_clean'); 
      $this->form_validation->set_rules('userPassword','Password', 'required|trim|max_length[200]|xss_clean|callback__checkUsernamePassword'); 

      if($this->form_validation->run() === FALSE) { 

       $data['contentMangement'] = $this->options_model->systemOptions(); 
       $data['pageTitle'] = 'Login'; 
       $data['message'] = validation_errors('<div class="alert alert-error">', '</div>'); 
       $this->load->view('_assets/header', $data); 
       $this->load->view('login', $data); 
       $this->load->view('_assets/footer'); 

      }elseif($this->form_validation->run() === TRUE){ 

      redirect('dashboard/home'); 
     } 
    } 


    function _checkUsernamePassword() { 

      $username = $this->input->post('userEmail'); 
      $password = $this->input->post('userPassword'); 

      $user = $this->user_model->check_login($username,$password); 

      if(! $user) 
      { 
       $this->form_validation->set_message('_checkUsernamePassword', 'Sorry the details you provided have not been found'); 
       return FALSE; 
      }else{ 
       $this->session->set_userdata('logged_in',TRUE); 
       return TRUE; 
      } 
    } 
} 
+0

我们可以在仪表板/主页上看到验证码吗? – MikeCruz13

+0

@ MikeCruz13登录验证?我没有任何有关仪表板/家庭的验证码,只是查看 –

+0

您是否也可以发布您的控制器。根据你的控制器的外观,我的答案可能是错误的。 – xbonez

回答

1

这是发生了什么事。

假设我正确登录您的登录控制器,您设置了logged_in = TRUE,并将我重定向到dashboard/home。在index()功能dashboard/home,如果logged_in = TRUE(它是)您将我重定向到dashboard/home再次。再一次,你检查logged_in = TRUE,并重新导向我,等等等等。

这导致无限重定向循环,导致310错误(太多重定向)。

您需要重新进行登录检查。在dashboard/homeindex(),这样做:

if ($this->session->userdata('logged_in') === FALSE) redirect(site_url('dashboard/login'));

现在,当我访问仪表板的家,你只能重定向我走,如果我没有登录这家保护您的仪表盘对非认证用户,而。不会将认证用户投入无限循环。

0

我觉得你首先应该创建一个MY_Controller要做到这一点,如果有一天您决定将会话变量名称从logged_in更改为logged,该怎么办?你会打开你所有的控制器并改变它的会话吗?

创建MY_Controller你将使所有其他控制器,如Home_Controller延长MY_Controller,如:

class Home extends MY_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
} 

MY_Controller

//under /application/core/ 
class MY_Controller extends Controller 
{ 
    public function __construct() 
    { 
    parent::__construct(); 
    if(!$this->session->userdata('logged_in')) 
     redirect('login'); 
    } 
} 

当然,这对你的Login_Controller您将扩展Controller和而不是MY_Controller,否则你将陷入无限循环。