2012-02-29 124 views
1

我在尝试为朋友初始化代码点火器项目时遇到了一个奇怪的问题。CI_Session在登录时创建两个session_id

我有一个控制器user具有两个功能:logindashboard

login功能:

function login() 
{ 
    if ($this->user_model->isLoggedIn()) 
     redirect('user', 'refresh'); 
    else 
    { 
     $this->load->library('form_validation'); 
     $this->form_validation->set_rules('username', 'Login', 'required'); 
     $this->form_validation->set_rules('password', 'Password', 'required'); 
     if (!$this->form_validation->run()) 
      $this->load->view('login'); 
     else 
     { 
      $username = $this->input->post('username'); 
      $password = $this->input->post('password'); 
      $validCredentials = $this->user_model->validCredentials($username, $password); 
      if ($validCredentials) 
       redirect('user/dashboard', 'refresh'); 
      else 
      { 
       $data['error_credentials'] = 'Wrong Username/Password'; 
      $this->load->view('login', $data); 
      } 
     } 
    } 
} 

dashboard功能:

function dashboard() 
{ 
    $data = array(); 
    $data['test'] = $this->session->all_userdata(); 
    if($this->user_model->isLoggedIn()) 
     $this->load->view('dashboard'); 
    else 
     $this->load->view('sashboardnon', $data); 
} 

在登录视图,有一个形式poove login函数,当我lo克,凭借良好的凭据,我被重定向到siconnon视图,这不是我所期望的。

这里是我的user_model.php:

class User_model extends CI_Model 
{ 
    function User_model() 
    { 
     parent::__construct(); 
     $this->load->library('session'); 
    } 

    function validCredentials($username, $password) 
    { 
     $this->load->library('encrypt'); 
     $password = $this->encrypt->sha1($password); 

     $req = "SELECT username, password FROM users WHERE username = ? AND password = ?"; 
     $data = array($username, $password); 
     $req = $this->db->query($req, $data); 
     if ($req->num_rows() > 0) 
     { 
      $res = $req->result(); 
      $session_data = array(
       'username' => $res[0]->username, 
       'logged_in' => TRUE, 
      ); 
      $this->session->set_userdata($session_data); 
      return true; 
     } 
     else 
      return false; 
    } 

    function isLoggedIn() 
    { 
     if ($this->session->userdata('logged_in')) 
      return true; 
     else 
      return false; 
    } 

    function logout() 
    { 
     $this->session->sess_destroy(); 
    } 

} 

当我看着我的数据库中ci_sessions表,我看到有两个新项目,当我点击登录按钮。一个与我刚刚从我的user_model添加的userdata,另一个没有它。

问题是当创建数据库中的第二个条目时,userdata中的值被删除。所以我无法登录。

做一个人知道问题可能来自哪里?

感谢

+0

为什么你把它作为一个“问题”?最有可能的只是防止会话固定/劫持 – zerkms 2012-02-29 09:48:34

+0

因为数据库中的第一个条目正确地有我的新用户数据,但不是第二个。 – 2012-02-29 09:51:20

+0

从你的问题和上面的评论中不清楚:记录工作与否? – zerkms 2012-02-29 09:56:16

回答

0

我认为上面的代码是一个非常合乎逻辑的不一致,你应该纠正。您必须将逻辑从模型移动到控制器。此外,将会话管理放在Controller中,并尝试仅使用模型与数据库交互。

(1)模型

class User_model extends CI_Model { 

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

    function get($params) 
    { 
     if(isset($params)) { 

      $this->db->where("username", $params['username']); 
      $this->db->where("password", $params['password']); 
      $query = $this->db->get(users); 

      if ($query->num_rows() > 0) { 
       return $query->result(); 
      } 
     } 
     return false; 
    } 

} 

(2)总监

class Auth extends CI_Controller { 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->load->model("users_model", "user"); 
    } 

    function isLogdedIn() 
    { 
     if ($this->session->userdata('logged_in')) { 
      return true; 
     } 

     return false; 
    } 

    function login() 
    { 
     if ($this->isLoggedIn()) { 
      redirect('user', 'refresh'); 
     } 
     else { 
      // show login form and put the logic here 
     }   
    } 



    function logout() 
    { 
     $this->session->sess_destroy(); 
    } 

    function validateCredentials($username, $password) 
    { 
     $params = array('username' => $username, 'password' => $password); 
     $result = $this->user->get($params); 

     if($result !== false) { 
      return true; 
     } 
     return false; 

    { 


} 

我希望上面的例子可以帮助你改善你的代码;)

+0

感谢您的提示!我将编辑我的帖子以显示新代码。但我的问题仍然是相同的:我存储我的userdata的会话被跳到另一个,我根本无法使用userdata :( – 2012-02-29 16:50:28

+0

实际上,我试图将$ config ['sess_use_database']设置为FALSE看到的行为,现在我的用户数据存储...但我真的不喜欢这个解决方案...任何想法? – 2012-02-29 16:55:24

+0

嗯我再次编辑此答案:当我使用Safari,我没有问题,我只在使用Chrome时遇到它。 – 2012-02-29 17:05:17