Ошибка codeigniter генерирует несколько сессий для одного и того же пользователя - PullRequest
0 голосов
/ 12 декабря 2018

Я новичок в этих рамках.Но создайте проект с codeigniter 3.19 и Ion Auth 3 в качестве метода аутентификации и регистрации пользователя.

на моем локальном сервере xampp windows, он отлично работает, генерирует сеанс для каждого пользователя.Но в моем веб-linux Ubuntu 16.04, vestacp, с cloudflare, я генерирую 10 сеансов каждые 1 сг, постоянно имея миллионы записей сеансов, и учитывая, что у меня очень мало трафика, я предполагаю, что это ошибка, которая создает повторяющиеся сеансы для каждого пользователя.

захват сеанса во всех полях ip_address дает мне ip моего сервера.

enter image description here web, чтобы проверить проблему подключенных конфигураций tvglu.net, очень благодарен любой помощи.

/application/config/config.php 

$config['sess_driver'] = 'database'; 
$config['sess_cookie_name'] = 'cisession'; 
$config['sess_expiration'] = 7200; 
$config['sess_save_path'] = 'ci_session'; 
$config['sess_match_ip'] = FALSE; 
$config['sess_time_to_update'] = 300; 
$config['sess_regenerate_destroy'] = FALSE; 

$config['cookie_prefix']    = 'cisession'; 
$config['cookie_domain']    = ''; 
$config['cookie_path']        = '/'; 
$config['cookie_secure']    = FALSE; 
$config['cookie_httponly']     = FALSE; 

$config['proxy_ips'] = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : '';
/application/config/autoload.php 

$autoload['libraries'] = array('ion_auth'); 

tabla base de datos 

CREATE TABLE `ci_session` ( 
 `id` varchar(128) NOT NULL, 
 `ip_address` varchar(45) NOT NULL, 
 `timestamp` int(10) unsigned NOT NULL DEFAULT '0', 
 `data` blob NOT NULL, 
 PRIMARY KEY (`id`), 
 KEY `ci_sessions_timestamp` (`timestamp`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1

/application/libraries/Ion_auth.php 

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 

class Ion_auth 
{ 
    /** 
     * account status ('not_activated', etc ...) 
     * 
     * @var string 
     **/ 
    protected $status; 

    /** 
     * extra where 
     * 
     * @var array 
     **/ 
    public $_extra_where = array(); 

    /** 
     * extra set 
     * 
     * @var array 
     **/ 
    public $_extra_set = array(); 

    /** 
     * caching of users and their groups 
     * 
     * @var array 
     **/ 
    public $_cache_user_in_group; 

    /** 
     * __construct 
     * 
     * @return void 
     * @author Ben 
     **/ 
    public function __construct() 
    { 
        $this->load->config('ion_auth', TRUE); 
        $this->load->library(array('email')); 
        $this->lang->load('ion_auth'); 
        $this->load->helper(array('cookie', 'language','url')); 

        $this->load->library('session'); 

        $this->load->model('ion_auth_model'); 

        $this->_cache_user_in_group =& $this->ion_auth_model->_cache_user_in_group; 

        //auto-login the user if they are remembered 
        if (!$this->logged_in() && get_cookie($this->config->item('identity_cookie_name', 'ion_auth')) && get_cookie($this->config->item('remember_cookie_name', 'ion_auth'))) 
        { 
            $this->ion_auth_model->login_remembered_user(); 
        } 

        $email_config = $this->config->item('email_config', 'ion_auth'); 

        if ($this->config->item('use_ci_email', 'ion_auth') && isset($email_config) && is_array($email_config)) 
        { 
            $this->email->initialize($email_config); 
        } 

        $this->ion_auth_model->trigger_events('library_constructor'); 
    } 

    /** 
     * __call 
     * 
     * Acts as a simple way to call model methods without loads of stupid alias' 
     * 
     **/ 
    public function __call($method, $arguments) 
    { 
        if (!method_exists( $this->ion_auth_model, $method) ) 
        { 
            throw new Exception('Undefined method Ion_auth::' . $method . '() called'); 
        } 
        if($method == 'create_user') 
        { 
            return call_user_func_array(array($this, 'register'), $arguments); 
        } 
        if($method=='update_user') 
        { 
            return call_user_func_array(array($this, 'update'), $arguments); 
        } 
        return call_user_func_array( array($this->ion_auth_model, $method), $arguments); 
    } 

    /** 
     * __get 
     * 
     * Enables the use of CI super-global without having to define an extra variable. 
     * 
     * I can't remember where I first saw this, so thank you if you are the original author. -Militis 
     * 
     * [MENTION=178865]Access[/MENTION]    public 
     * @param    $var 
     * @return    mixed 
     */ 
    public function __get($var) 
    { 
        return get_instance()->$var; 
    } 


    /** 
     * forgotten password feature 
     * 
     * @return mixed  boolian / array 
     * @author Mathew 
     **/ 
    public function forgotten_password($identity)    //changed $email to $identity 
    { 
        if ( $this->ion_auth_model->forgotten_password($identity) )   //changed 
        { 
            // Get user information 
            $user = $this->where($this->config->item('identity', 'ion_auth'), $identity)->where('active', 1)->users()->row();  //changed to get_user_by_identity from email 

            if ($user) 
            { 
                $data = array( 
                    'identity'        => $user->{$this->config->item('identity', 'ion_auth')}, 
                    'forgotten_password_code' => $user->forgotten_password_code 
                ); 

                if(!$this->config->item('use_ci_email', 'ion_auth')) 
                { 
                    $this->set_message('forgot_password_successful'); 
                    return $data; 
                } 
                else 
                { 
                    $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_forgot_password', 'ion_auth'), $data, true); 
                    $this->email->clear(); 
                    $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); 
                    $this->email->to($user->email); 
                    $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_forgotten_password_subject')); 
                    $this->email->message($message); 

                    if ($this->email->send()) 
                    { 
                        $this->set_message('forgot_password_successful'); 
                        return TRUE; 
                    } 
                    else 
                    { 
                        $this->set_error('forgot_password_unsuccessful'); 
                        return FALSE; 
                    } 
                } 
            } 
            else 
            { 
                $this->set_error('forgot_password_unsuccessful'); 
                return FALSE; 
            } 
        } 
        else 
        { 
            $this->set_error('forgot_password_unsuccessful'); 
            return FALSE; 
        } 
    } 

    /** 
     * forgotten_password_complete 
     * 
     * @return void 
     * @author Mathew 
     **/ 
    public function forgotten_password_complete($code) 
    { 
        $this->ion_auth_model->trigger_events('pre_password_change'); 

        $identity = $this->config->item('identity', 'ion_auth'); 
        $profile  = $this->where('forgotten_password_code', $code)->users()->row(); //pass the code to profile 

        if (!$profile) 
        { 
            $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); 
            $this->set_error('password_change_unsuccessful'); 
            return FALSE; 
        } 

        $new_password = $this->ion_auth_model->forgotten_password_complete($code, $profile->salt); 

        if ($new_password) 
        { 
            $data = array( 
                'identity'     => $profile->{$identity}, 
                'new_password' => $new_password 
            ); 
            if(!$this->config->item('use_ci_email', 'ion_auth')) 
            { 
                $this->set_message('password_change_successful'); 
                $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_successful')); 
                    return $data; 
            } 
            else 
            { 
                $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_forgot_password_complete', 'ion_auth'), $data, true); 

                $this->email->clear(); 
                $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); 
                $this->email->to($profile->email); 
                $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_new_password_subject')); 
                $this->email->message($message); 

                if ($this->email->send()) 
                { 
                    $this->set_message('password_change_successful'); 
                    $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_successful')); 
                    return TRUE; 
                } 
                else 
                { 
                    $this->set_error('password_change_unsuccessful'); 
                    $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); 
                    return FALSE; 
                } 

            } 
        } 

        $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); 
        return FALSE; 
    } 

    /** 
     * forgotten_password_check 
     * 
     * @return void 
     * @author Michael 
     **/ 
    public function forgotten_password_check($code) 
    { 
        $profile = $this->where('forgotten_password_code', $code)->users()->row(); //pass the code to profile 

        if (!is_object($profile)) 
        { 
            $this->set_error('password_change_unsuccessful'); 
            return FALSE; 
        } 
        else 
        { 
            if ($this->config->item('forgot_password_expiration', 'ion_auth') > 0) { 
                //Make sure it isn't expired 
                $expiration = $this->config->item('forgot_password_expiration', 'ion_auth'); 
                if (time() - $profile->forgotten_password_time > $expiration) { 
                    //it has expired 
                    $this->clear_forgotten_password_code($code); 
                    $this->set_error('password_change_unsuccessful'); 
                    return FALSE; 
                } 
            } 
            return $profile; 
        } 
    } 

    /** 
     * register 
     * 
     * @return void 
     * @author Mathew 
     **/ 
    public function register($username, $password, $email, $additional_data = array(), $group_ids = array()) //need to test email activation 
    { 
        $this->ion_auth_model->trigger_events('pre_account_creation'); 

        $email_activation = $this->config->item('email_activation', 'ion_auth'); 

        if (!$email_activation) 
        { 
            $id = $this->ion_auth_model->register($username, $password, $email, $additional_data, $group_ids); 
            if ($id !== FALSE) 
            { 
                $this->set_message('account_creation_successful'); 
                $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful')); 
                return $id; 
            } 
            else 
            { 
                $this->set_error('account_creation_unsuccessful'); 
                $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful')); 
                return FALSE; 
            } 
        } 
        else 
        { 
            $id = $this->ion_auth_model->register($username, $password, $email, $additional_data, $group_ids); 

            if (!$id) 
            { 
                $this->set_error('account_creation_unsuccessful'); 
                return FALSE; 
            } 

            $deactivate = $this->ion_auth_model->deactivate($id); 

            if (!$deactivate) 
            { 
                $this->set_error('deactivate_unsuccessful'); 
                $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful')); 
                return FALSE; 
            } 

            $activation_code = $this->ion_auth_model->activation_code; 
            $identity        = $this->config->item('identity', 'ion_auth'); 
            $user            = $this->ion_auth_model->user($id)->row(); 

            $data = array( 
                'identity'   => $user->{$identity}, 
                'id'         => $user->id, 
                'email'      => $email, 
                'activation' => $activation_code, 
            ); 
            if(!$this->config->item('use_ci_email', 'ion_auth')) 
            { 
                $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful', 'activation_email_successful')); 
                $this->set_message('activation_email_successful'); 
                    return $data; 
            } 
            else 
            { 
                $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_activate', 'ion_auth'), $data, true); 

                $this->email->clear(); 
                $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); 
                $this->email->to($email); 
                $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_activation_subject')); 
                $this->email->message($message); 

                if ($this->email->send() == TRUE) 
                { 
                    $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful', 'activation_email_successful')); 
                    $this->set_message('activation_email_successful'); 
                    return $id; 
                } 

            } 

            $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful', 'activation_email_unsuccessful')); 
            $this->set_error('activation_email_unsuccessful'); 
            return FALSE; 
        } 
    } 

    /** 
     * logout 
     * 
     * @return void 
     * @author Mathew 
     **/ 
    public function logout() 
    { 
        $this->ion_auth_model->trigger_events('logout'); 

        $identity = $this->config->item('identity', 'ion_auth'); 
                $this->session->unset_userdata( array($identity => '', 'id' => '', 'user_id' => '') ); 

        //delete the remember me cookies if they exist 
        if (get_cookie($this->config->item('identity_cookie_name', 'ion_auth'))) 
        { 
            delete_cookie($this->config->item('identity_cookie_name', 'ion_auth')); 
        } 
        if (get_cookie($this->config->item('remember_cookie_name', 'ion_auth'))) 
        { 
            delete_cookie($this->config->item('remember_cookie_name', 'ion_auth')); 
        } 

        //Destroy the session 
        $this->session->sess_destroy(); 

        //Recreate the session 
        if (substr(CI_VERSION, 0, 1) == '2') 
        { 
            $this->session->sess_create(); 
        } 
        else 
        { 
            $this->session->sess_regenerate(TRUE); 
        } 

        $this->set_message('logout_successful'); 
        return TRUE; 
    } 

    /** 
     * logged_in 
     * 
     * @return bool 
     * @author Mathew 
     **/ 
    public function logged_in() 
    { 
        $this->ion_auth_model->trigger_events('logged_in'); 

        return (bool) $this->session->userdata('identity'); 
    } 

    /** 
     * logged_in 
     * 
     * @return integer 
     * @author jrmadsen67 
     **/ 
    public function get_user_id() 
    { 
        $user_id = $this->session->userdata('user_id'); 
        if (!empty($user_id)) 
        { 
            return $user_id; 
        } 
        return null; 
    } 


    /** 
     * is_admin 
     * 
     * @return bool 
     * @author Ben Edmunds 
     **/ 
    public function is_admin($id=false) 
    { 
        $this->ion_auth_model->trigger_events('is_admin'); 

        $admin_group = $this->config->item('admin_group', 'ion_auth'); 

        return $this->in_group($admin_group, $id); 
    } 

    /** 
     * in_group 
     * 
     * @param mixed group(s) to check 
     * @param bool user id 
     * @param bool check if all groups is present, or any of the groups 
     * 
     * @return bool 
     * @author Phil Sturgeon 
     **/ 
    public function in_group($check_group, $id=false, $check_all = false) 
    { 
        $this->ion_auth_model->trigger_events('in_group'); 

        $id || $id = $this->session->userdata('user_id'); 

        if (!is_array($check_group)) 
        { 
            $check_group = array($check_group); 
        } 

        if (isset($this->_cache_user_in_group[$id])) 
        { 
            $groups_array = $this->_cache_user_in_group[$id]; 
        } 
        else 
        { 
            $users_groups = $this->ion_auth_model->get_users_groups($id)->result(); 
            $groups_array = array(); 
            foreach ($users_groups as $group) 
            { 
                $groups_array[$group->id] = $group->name; 
            } 
            $this->_cache_user_in_group[$id] = $groups_array; 
        } 
        foreach ($check_group as $key => $value) 
        { 
            $groups = (is_string($value)) ? $groups_array : array_keys($groups_array); 

            /** 
             * if !all (default), in_array 
             * if all, !in_array 
             */ 
            if (in_array($value, $groups) xor $check_all) 
            { 
                /** 
                 * if !all (default), true 
                 * if all, false 
                 */ 
                return !$check_all; 
            } 
        } 
        /** 
         * if !all (default), false 
         * if all, true 
         */ 
        return $check_all; 
    } 
}

1 Ответ

0 голосов
/ 13 декабря 2018

У меня была похожая проблема пару месяцев назад.

Поскольку вы используете cloudflare, у которого есть несколько выходных узлов, которым необходимо постоянно знать, живо ваше приложение или нет, вы, вероятно, получаете удар понесколько проверок здоровья.Если проверки работоспособности направлены на часть вашего сайта, которая загружает библиотеку сеансов, каждая проверка работоспособности будет создавать пустой сеанс (вы можете проверить ... В большинстве строк сеанса в таблице будет пустое поле data)

Поскольку вы автоматически загружаете ion auth и в нем вы загружаете библиотеку сессий в конструктор, это складывается.

Есть способы обойти это: вы можете настроить Cloudflare на проверку работоспособностина какую-то часть вашего сайта, которая не использует сессии.Если это вариант, это самое простое / чистое исправление, требующее нулевого кодирования.

Если вы не можете изменить, куда Cloudflare отправляет свои чеки, не все потеряно.Вы можете установить исключение, при котором не выполняются автозагрузка Ion и / или библиотеки сеансов для конкретного контроллера / метода, в котором выполняются проверки работоспособности.Хороший указатель о том, как это сделать, можно найти здесь:

Codeigniter: Изменить библиотеки автозагрузки для одного контроллера?

Если это тоже не вариант, и выВы не можете «защитить» себя от этого, вы можете установить простой служебный скрипт, который периодически удаляет пустые сессии.Это не оптимально, но помогает

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