我可以设置离子AUTH通过用户名或邮箱登录(Can I set Ion auth to login

2019-09-23 03:37发布

我知道我可以设置离子AUTH通过在配置用户名登录,我也知道我可以把它通过电子邮件在配置登录。

有一个简单的方法来设置它为使用自动?

Answer 1:

如果自动的,你的意思是一个尝试,然后其他,看看要么给出一个有效的回报:

登录发生在ion_auth_model线:899

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

所以你可以改变这个做一个“或”并尝试两列。 您将需要整个模型中,这样做是因为有不只是实际的登录更多的考虑和有一个用户具有电子邮件是另一个用户的用户名的潜在问题(但不太可能)



Answer 2:

它可能只有几码的行:让我们假设这是您的ion_auth配置文件:

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

你必须运行两次登录功能。 如果第一次尝试(使用用户名)没有成功,您可以更改识别码,然后重试:

$这个 - > ion_auth_model-> identity_column = “电子邮件”;

在模型或库或定制querys neccesary没有修改



Answer 3:

我最近分叉离子验证,并作出必要的改进,使这可能在配置选择。 叉位于:

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

我提出了一个拉入请求得到这个列入离子验证的代码基础,但它尚未在这个时候接受。 有一些争论正在进行关于是否使代码复杂。 请把它们记,让他们知道你想这个功能,如果它是对你有用。

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



Answer 4:

无需编辑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回购讨论:

  • 问题510:用户名/电子邮件身份之间切换
  • 问题792:与用户名或邮箱登录
  • 拉请求746:添加选项替代标识列


Answer 5:

使用“身份”,“电子邮件” ion_auth配置然后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']);
}


Answer 6:

我认为,更简单的方式将被检查是否$身份变种是一个电子邮件。 如果它不是一个电子邮件,那么你将列设置为“用户名”。 事情是这样的:

$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。

我的作品。



Answer 7:

把这个在你的控制器

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。 发现功能登录()和更新使用下面的代码的代码。

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


Answer 8:

为此,您可以在不修改核心代码。 只要改变对飞标识列,如果一个有效的电子邮件是存在的。 注: ion_auth_modelion_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());
    }
}


文章来源: Can I set Ion auth to login by username OR Email