Unserialize Database Session Codeigniter - PullRequest
0 голосов
/ 13 января 2012

У меня проблема с сеансом базы данных Codeigniter.

Чтобы сделать его коротким, я не хочу многократного входа с одинаковыми учетными данными (логин / пароль).

Первая проверкасделано по совпадениям имени пользователя / пароля в базе данных.

Вот мой код

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);
    }

}
}

Я знаю, что мне нужно использовать сеанс Unserialize.Я не могу получить массив, но я не знаю, как сравнить данные с зарегистрированным пользователем.Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 25 января 2012

Вы можете попробовать что-то вроде этого:

$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;
                }
            }
        }

ИЛИ в качестве альтернативы вы можете использовать cookie

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
}

Con : они могут обойти это, если они попытаются войти через новый компьютер

Примечание : может потребоваться установить время истечения, соответствующее времени сеанса, т. Е. 2 ​​часа (7200).

0 голосов
/ 13 января 2012

Просто добавьте еще один столбец (скажем, «user_id») в таблицу сессий, чтобы вы могли проверить его с помощью одного простого SQL-запроса.unserialize() (она вам понадобится) обычно очень медленная функция, и проверка каждой строки в таблице сеансов может стать проблемой.

Но ... вот как CodeIgniter десериализует данные своего сеанса:

    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;
    }

... и вот так его называют:

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

Вы могли бы использовать их напрямую, если бы они не были защищены, но ... все же, вероятно, лучше просто расширитьбиблиотека сеансов вместо того, чтобы реализовывать ее самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...