2012-01-13 14 views
0

Codeigniter Database Sessionに問題があります。データベースセッションのシリアル化を解除するCodeigniter

簡潔にするため、私は同じ資格情報(ログイン/パスワード)で複数のログインをしたくありません。

最初の確認は、データベースのusername/passwodの一致によって行われます。

は、ここで私は、私はセッションアンシリアライズを使用しなければならないのを知っている私のコード

function index() 
{ 
    // Load Model. 
    $this->load->model('membres_model'); 

    // Check if the user is already logged 
    if($this->session->userdata('alias') || $this->session->userdata('logged')) 
    { 
     //Redirect if he is logged. 
     redirect('membres/'); 
    } 
    // If the form has been sent. 
    if($this->input->post('submit')) 
    {   
     // Trim data 
     $this->form_validation->set_rules('alias','Nom d\'utilisateur','trim|required|xss_clean'); 
     $this->form_validation->set_rules('motdepasse','Mot de passe','trim|required|xss_clean'); 

     if($this->form_validation->run()) 
     { 
      // check verification in the model 
      if($this->membres_model->verification_connexion($this->input->post('alias'),$this->input->post('motdepasse'))) 
      { 
       // Set userdata variables 
       $data = array(
        'alias'  => $this->input->post('alias'), 
        'addr_ip' => $_SERVER['REMOTE_ADDR'], 
        'hote'  => gethostbyaddr($_SERVER['REMOTE_ADDR']), 
        'logged' => true 
       ); 

        /**************************************** 
        I Want to verify if the membres is already logged if another one want to use the      same login/password of the logged on. but I don't know how to verify in the       ci_sessions 
        *****************************************/ 

        // start session 
        $this->session->set_userdata($data); 
        // Redirection sur l'espace membre apres la creation de la session. 
        redirect('membres/'); 
      } 
      else { 
       // if return false 
       $data['error'] = 'Mauvais identifiants'; 
       $data['contenu'] = 'connexion/formulaire'; 
       $this->load->view('includes/template',$data); 
      } 
     } 
     else { 

      $data['contenu'] = 'connexion/formulaire'; // La variable vue pour loader dans le template. 
      $this->load->view('includes/template',$data); 
     } 

    } 
    else { 

     $data['contenu'] = 'connexion/formulaire'; // La variable vue pour loader dans le template. 
     $this->load->view('includes/template',$data); 
    } 

} 
} 

です。私は配列を取得することはできませんが、私はどのようにログに記録されたユーザーとのデータを比較するのか分かりません。誰も私を助けることができますか?

答えて

0

ただ、セッションテーブルに(「USER_ID」と言う)別の列を追加しますので、あなたは、単一の、シンプルなSQLクエリでそれを確認することができます。 unserialize()(これが必要です)は、通常、非常に遅い関数であり、セッションテーブルの各行が問題になる可能性があります。

しかし...ここCodeIgniterのは、それがセッションデータですunserializes方法は次のとおりです。

protected function _unserialize($data) 
    { 
      $data = @unserialize(strip_slashes($data)); 

      if (is_array($data)) 
      { 
        array_walk_recursive($data, array(&$this, '_unescape_slashes')); 
        return $data; 
      } 

      return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data; 
    } 

...とここで呼ばれる1だ:

protected function _unescape_slashes(&$val, $key) 
    { 
      if (is_string($val)) 
      { 
        $val= str_replace('{{slash}}', '\\', $val); 
      } 
    } 

彼らがいた場合は、直接それらを使用していたかもしれません保護されていませんが、セッションライブラリを自分で実装するのではなく、単に拡張する方が良いでしょう。

+0

ご協力いただきありがとうございますが、実際に私は、ユーザー名が配列であると私は検証する方法がわからないかどうかを検出する必要があります。 –

0

あなたはこのような何かを試みることができる:

$sessions = "SELECT * FROM ci_sessions"; // return as object 

     foreach($sessions as $sess) 
     { 
      foreach(unserialize($sess->user_data) as $k => $v) 
      { 
       if($k === 'alias' AND isset($v)) 
       { 
        return true; 
       } 
      } 
     } 

OR、あなたの前にチェックを行う、あなたのフォーム検証の内側クッキー

public function _before_check($alias) // alias should have UNIQUE constraint 
{ 
    return ($this->input->cookie('my_cookie_'.$alias, TRUE)) ? TRUE : FALSE; 
} 

を使用する場合があります代替としてを!

if($this->_before_check($alias)) 
{ 
    //already logged In 
} 
else 
{ 
    //log them in AND set your cookie 
} 

コン:あなたのセッション時間に合わせて、あなたの有効期限が切れる時間を設定することをお勧めします、すなわち:2時間(7200彼らは新しいコンピュータを介して

をログインをしようとすると、彼らはこれをバイパスすることができます)。

関連する問題