2012-08-25 81 views
0

我想用CodeIgniter和jQuery進行用戶身份驗證。我已經設法做到以下幾點:如果用戶鍵入錯誤的用戶名或密碼,他仍然在登錄頁面並使用jquery,他會得到通知他輸入了錯誤的用戶名或密碼。codeigniter和jquery用戶身份驗證

我的問題是成功,那就是如果他輸入正確的用戶名和密碼,我設法用簡單的JavaScript重定向發送登錄頁面上的用戶,但那不是我想要的。如果我使用簡單的JavaScript重定向,我無法填充用戶會話數據,我需要在所有其他頁面上登錄後跟蹤用戶。

我想如果可能的話,如果用戶輸入正確的用戶名和密碼,jquery什麼也不做,並且只有在用戶輸入錯誤的用戶名或密碼的情況下才能激活該功能。

這是我的代碼。 JS代碼第一:

formLogin.on('submit', function(e) {  
    e.preventDefault(); 
    $.ajax({ 
    type  : 'POST', 
    url  : 'loginCheck', 
    data  : formLogin.serialize(), 
    dataType : 'json', 
    success : function(r) { 


     if (r.status) { 
      // this works, but I would like this part to do nothing 
      // just to leave my PHP controller to redirect the user 
      window.location = 'http://www.linkedin.com'; 

     } else { 
      $('#errorMessageTop').fadeIn(); 

     } 

    } 
}); 

}); 

而控制器代碼:

public function loginCheck() 
    { 

     // set the validation rules 
     $this->form_validation->set_rules('username', 'Username', 'required|trim|encode_php_tags'); 
     $this->form_validation->set_rules('password', 'Password', 'required|trim|encode_php_tags'); 
     $this->form_validation->set_error_delimiters('<br /><p class=jsdiserr>', '</p><br />'); 
     if ($this->form_validation->run() != FALSE) 
     { 

      $ids=array(); 
      $ids[0]=$this->db->where('username', $this->input->post('username')); 
      $ids[1] = $this->db->where('password', md5($this->input->post('password'))); 
      $query = $this->backOfficeUsersModel->get(); 

      if($query) 
       { 
        $data = array(
        'username'  => $this->input->post('username'), 
        'isUserLoggedIn' => true 
        ); 
       $isAuthenticated = true; 
       if ($isAuthenticated) { 
       $return['status'] = true; 
       $return['message'] = 'You have successfully been logged in!'; 
       exit(json_encode($return)); 
       $this->session->set_userdata($data); 
       $data['title'] = "Welcome to dashboard!"; 
       $data['main_content'] = 'dashboard'; 
       $this->load->vars($data); 
       $this->load->view('backOffice/template'); 


       } 

     } else { 

       $return = array(
       'status' => false, 
       'message' => 'Wrong Username or Password' 
       ); 
       exit(json_encode($return)); 

     } 
     } else { 

      $errorMessage = "Second Message Wrong username or pwd...!"; 
      $errorMessage = json_encode($errorMessage); 

     } 



    } // end of function loginCheck 

任何幫助將十分讚賞。

問候,卓然

===============

從控制器的新代碼:

public function loginCheck() 
    { 

     // set the validation rules 
     $this->form_validation->set_rules('username', 'Username', 'required|trim|encode_php_tags'); 
     $this->form_validation->set_rules('password', 'Password', 'required|trim|encode_php_tags'); 
     $this->form_validation->set_error_delimiters('<br /><p class=jsdiserr>', '</p><br />'); 
     if ($this->form_validation->run() != FALSE) 
     { 

      $ids=array(); 
      $ids[0]=$this->db->where('username', $this->input->post('username')); 
      $ids[1] = $this->db->where('password', md5($this->input->post('password'))); 
      $query = $this->backOfficeUsersModel->get(); 

      if($query) 
       { 
        $data = array(
        'username'  => $this->input->post('username'), 
        'isUserLoggedIn' => true 
        ); 


       $this->session->set_userdata($data); 
       echo json_encode(array("success" => true)); 
       $data['title'] = "Welcome to dashboard!"; 
       $data['main_content'] = 'dashboard'; 
       $this->load->vars($data); 
       $this->load->view('backOffice/template'); 


     } else { 

       echo json_encode(array("success" => false, "error" => "Wrong credentials")); 

     } 
     } else { 

      $errorMessage = "Second Message Wrong username or pwd...!"; 
      $errorMessage = json_encode($errorMessage); 

     } 



    } // end of function loginCheck 

而且JS代碼:

$("#formLogin").submit(function(e){ 
     e.preventDefault(); 
     var username = $(this).find("#username").val(); 
     var password = $(this).find("#password").val(); 
     var obj = {username: username, password: password}; 
     var url = $(this).attr("action"); 
     $.post(url, obj, function(r){ 
      if(r.success) window.location.replace('http://www.linkedin.com'); 
      else $('#errorMessageTop').fadeIn(); 
     }, 'json'); 
    }) 
+0

要重定向成功後,用戶在哪裏?如果沒有在那裏只是刪除該代碼 –

+0

刪除代碼只是導致用戶在登錄頁面停滯不前,因爲防止默認我猜 – Zoran

回答

1

你爲什麼打電話exit()?...終止腳本並阻止設置會話。另外,您將$isAuthenticated設置爲true並立即檢查是否爲true。當然會的。

這是我如何處理它的精簡版......在我的控制器:

function take_creds(){ 

     $p = $this->input->post(); 
     if($p){ 
      $u = new User(); 
      $u->where("username", $p['username']); 
      $u->where("password", sha1($p['password'])); 
      $u->get(); 
      if($u->exists()){ 
       $u->loggedin = 1; 
       $u->save(); 

       $data = array(
        'username' => $u->username, 
        'loggedin' => true 
       ); 

       $this->session->set_userdata($data); 
       echo json_encode(array("success" => true)); 
      } 
      else echo json_encode(array("success" => false, "error" => "Wrong credentials")); 
     } 
    } 

和相應的jQuery:

$("#login_form").submit(function(e){ 
      e.preventDefault(); 
      var username = $(this).find("#login_username").val(); 
      var password = $(this).find("#login_password").val(); 
      var obj = {username: username, password: password}; 
      var url = $(this).attr("action"); 
      $.post(url, obj, function(r){ 
       if(r.success) window.location.replace('home'); 
       else console.log("Write this error to the DOM: " + r.error); 
      }, 'json'); 
     }) 
+0

嗨喬丹。感謝您的回答。我有一個問題,你會在哪裏設置用戶會話數據,如果你直接從JavaScript重定向用戶?我可以直接將用戶發送到儀表板,但我想保存用戶名,並設置isLoggedin = true。如果我只是將用戶發送到儀表板,那麼我什麼都不會做。任何輸入dashboard.php的用戶都將被登錄。或者我錯了? – Zoran

+0

對不起......我只是注意到你的代碼中保存了會話數據。我猜測它在設置時會從那裏開始工作。我會立即嘗試你的代碼。 – Zoran

+0

@Zoran儀表板控制器應該檢查以確保用戶在渲染視圖,輸出數據等之前已登錄。執行此操作的最佳方式是創建一個名爲'MY_In_Controller'的超級控制器,將「is用戶登錄?」檢查它的構造函數,然後讓所有的控制器繼承這個超級控制器。見[保持乾燥](http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY)。簡而言之 - 將儀表板控制器鍵入到其URL欄中的用戶將立即被踢出,因爲他們的會話不存在。這有幫助嗎? –