Могу ли я настроить Ion auth для входа по имени пользователя ИЛИ электронной почте

Я знаю, что могу настроить ion auth для входа в систему по имени пользователя в конфигурации, я также знаю, что могу настроить ее для входа по электронной почте в конфигурации.

Есть ли простой способ настроить его на автоматическое использование?


person SwiftD    schedule 27.09.2012    source источник


Ответы (8)


Если под автоматическим вы имеете в виду попробовать один, а затем другой, чтобы увидеть, дает ли какой-либо действительный возврат:

Логин происходит в строке ion_auth_model: 899

->where($this->identity_column, $this->db->escape_str($identity))

поэтому вы можете изменить это, чтобы сделать «или» и попробовать оба столбца. Вам нужно будет сделать это на протяжении всей модели, потому что нужно учитывать больше, чем просто фактический вход в систему, и существует потенциальная проблема, связанная с тем, что у пользователя есть электронная почта, которая является именем пользователя другого пользователя (однако маловероятно)

person jmadsen    schedule 17.11.2012
comment
Я надеялся, что это можно настроить, но спасибо, что сообщили мне. Я займусь этим, когда у меня будет время. - person SwiftD; 29.11.2012

Это возможно только с несколькими строками кода: Предположим, что это ваш файл конфигурации ion_auth:

$config['identity'] = 'username'; // A database column which is used to login with

вам нужно дважды запустить функцию входа в систему. Если первая попытка (с именем пользователя) не удалась, вы можете изменить идентификатор и повторить попытку:

$this->ion_auth_model->identity_column = "электронная почта";

Никаких изменений в модели или библиотеке или пользовательских запросах не требуется.

person Shardas    schedule 17.05.2016
comment
Не трогал codeigniter уже много лет, но, если предположить, что это работает, это кажется элегантным решением. - person SwiftD; 18.05.2016

без необходимости редактирования ion_auth_model вы можете сделать что-то вроде этого:

учитывая, что у вас уже есть эта конфигурация:

 $config['identity'] = 'username';

и у вас есть это на вашем контроллере:

// log the user in
public function login()
{
...
    if ($this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember))
    {
    //if the login is successful

вы можете позволить ему проверить, а затем, если это не удастся, установите email как столбец идентификатора и проверьте его:

// log the user in
public function login()
{
...

    // check for username
    $login = $this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember);
    if(! $login) { // username is not successful
        $this->ion_auth_model->identity_column = 'email';
        // check for email
        $login = $this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember);
    }

    if( $login ) {
         // successful
    } else {
         // both failed
    }

Преимущество этого: большая совместимость с любым новым обновлением ionAuth, поскольку вы не меняли основные файлы. Недостаток этого в том, что приходится дважды запрашивать базу данных.


Код контроллера аутентификации изменен из: Пример контроллера аутентификации ionAuth

Обсуждение репозитория ionAuth:

person Mohannad Najjar    schedule 30.09.2016
comment
Такой спасатель! - person elimariaaa; 05.12.2019

Недавно я разветвил Ion Auth и сделал необходимые улучшения, чтобы это можно было выбрать в конфигурации. Вилка находится здесь:

https://github.com/zepernick/CodeIgniter-Ion-Auth

Я предложил запрос на добавление, чтобы включить его в кодовую базу Ion Auth, но в настоящее время он не принят. Были некоторые споры о том, делает ли это код сложным. Пожалуйста, напишите им записку и сообщите, что вам нужна эта функция, если она вам полезна.

https://github.com/benedmunds/CodeIgniter-Ion-Auth/pull/746

person Paul Zepernick    schedule 19.03.2015
comment
Мне грустно, что они до сих пор не объединили его в основной репозиторий. - person iamjc015; 31.12.2015

используйте «email» в конфигурации «identity» ion_auth, затем добавьте этот код после $query в строке ion_auth_model 866

if($query->num_rows() == 0){
    $query = $this->db->select($this->identity_column . ', username, email, id, password, active, last_login')
          ->where('username', $this->db->escape_str($identity))
          ->limit(1)
          ->get($this->tables['users']);
}
person Made Dedy    schedule 24.01.2013

Я думаю, что проще было бы проверить, является ли переменная $identity электронной почтой. Если это не электронная почта, вы устанавливаете столбец «имя пользователя». Что-то вроде этого:

$check_column = valid_email($identity) ? $this->identity_column : 'username';   
$query = $this->db->select('username, email, id, password, active, last_login')
    ->where($check_column, $this->db->escape_str($identity))
    ->limit(1)
    ->get($this->tables['users']);

В этом случае вам понадобится загрузить файл email_helper.

Работает на меня.

person Rafael Willians    schedule 24.07.2013

Поместите это на свой контроллер

if ($this->form_validation->run() !== FALSE) {
    $remember = (bool) $this->input->post('remember');
    $this->ion_auth_model->identity_column = 'username/email';

    if ($this->ion_auth->login($this->input->post('username'), $this->input->post('password'), $remember))
    {
        $this->session->set_flashdata('message', $this->ion_auth->messages());
    }
    redirect('auth/login');
}

Отредактируйте ion_auth_model.php. найдите функцию login() и обновите код, используя приведенный ниже код.

public function login($identity, $password, $remember=FALSE)
    {
        $this->trigger_events('pre_login');

        if (empty($identity) || empty($password))
        {
            $this->set_error('login_unsuccessful');
            return FALSE;
        }

        $this->trigger_events('extra_where');

        //just add this (starting this line)
        if ($this->identity_column == "username/email")
        {
            $fieldname = explode('/', $this->identity_column);
            $query = $this->db->select($fieldname[0] . ', username, email, id, password, active, last_login')
                          ->where($fieldname[0], $identity)
                          ->limit(1)
                          ->get($this->tables['users']);

            $this->identity_column = $fieldname[0];

            if ($query->num_rows() === 0) {
                $query = $this->db->select($fieldname[1] . ', username, email, id, password, active, last_login')
                          ->where($fieldname[1], $identity)
                          ->limit(1)
                          ->get($this->tables['users']);

                $this->identity_column = $fieldname[1];
            }
        }
        else
        {
            $query = $this->db->select($this->identity_column . ', username, email, id, password, active, last_login')
                          ->where($this->identity_column, $identity)
                          ->limit(1)
                          ->get($this->tables['users']);
        }
        //up to this line   

        if($this->is_time_locked_out($identity))
        {
            //Hash something anyway, just to take up time
            $this->hash_password($password);

            $this->trigger_events('post_login_unsuccessful');
            $this->set_error('login_timeout');

            return FALSE;
        }

        if ($query->num_rows() === 1)
        {
            $user = $query->row();

            $password = $this->hash_password_db($user->id, $password);

            if ($password === TRUE)
            {
                if ($user->active == 0)
                {
                    $this->trigger_events('post_login_unsuccessful');
                    $this->set_error('login_unsuccessful_not_active');

                    return FALSE;
                }

                $this->set_session($user);

                $this->update_last_login($user->id);

                $this->clear_login_attempts($identity);

                if ($remember && $this->config->item('remember_users', 'ion_auth'))
                {
                    $this->remember_user($user->id);
                }

                $this->trigger_events(array('post_login', 'post_login_successful'));
                $this->set_message('login_successful');

                return TRUE;
            }
        }

        //Hash something anyway, just to take up time
        $this->hash_password($password);

        $this->increase_login_attempts($identity);

        $this->trigger_events('post_login_unsuccessful');
        $this->set_error('login_unsuccessful');

        return FALSE;
    }
person Alverated    schedule 16.07.2014

Вы можете сделать это, не изменяя основной код. Просто измените столбец идентификатора на лету, если присутствует действительный адрес электронной почты. ПРИМЕЧАНИЕ. ion_auth_model не ion_auth.

public function check_login()
{
    if (!$this->input->is_ajax_request()) {
        exit('No direct script access allowed');
    }
    $this->form_validation->set_rules('username', str_replace(':', '', $this->lang->line('login_identity_label')), 'required');
    $this->form_validation->set_rules('password', str_replace(':', '', $this->lang->line('login_password_label')), 'required');
    if ($this->form_validation->run() == false) {
        $this->form_validation->json_errors();
    }
    $identity = $this->input->post('username');
    if ($this->form_validation->valid_email($identity)) {
        $this->ion_auth_model->identity_column = 'email';
    } else {
        $this->ion_auth_model->identity_column = 'username';
    }
    if ($this->ion_auth->login($identity, $this->input->post('password'), false)) {
        encode_response('success');
    } else {
        encode_response('error', $this->ion_auth->errors());
    }
}
person Alex    schedule 30.10.2017