我知道我可以在配置中将 ion auth 设置为通过用户名登录,我也知道我可以在配置中将其设置为通过电子邮件登录。
有没有一种简单的方法可以将其设置为自动使用?
我知道我可以在配置中将 ion auth 设置为通过用户名登录,我也知道我可以在配置中将其设置为通过电子邮件登录。
有没有一种简单的方法可以将其设置为自动使用?
如果通过自动,您的意思是尝试一个然后另一个,看看是否有一个有效的回报:
登录发生在 ion_auth_model 行:899
->where($this->identity_column, $this->db->escape_str($identity))
因此您可以将其更改为“或”并尝试两列。您需要在整个模型中执行此操作,因为要考虑的不仅仅是实际登录,还有一个潜在问题是用户的电子邮件是另一个用户的用户名(但不太可能)
它可能只需要几行代码:让我们假设这是您的 ion_auth 配置文件:
$config['identity'] = 'username'; // A database column which is used to login with
您必须运行两次登录功能。如果第一次尝试(使用用户名)没有成功,您可以更改标识符并重试:
$this->ion_auth_model->identity_column = "email";
无需修改模型或库或自定义查询
无需编辑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 的任何新更新都具有更高的兼容性,因为您没有更改核心文件。这样做的缺点是它必须双重查询数据库。
Auth 控制器代码修改自: ionAuth Auth Controller Example
关于ionAuth Repo的讨论:
我最近分叉了 Ion Auth 并进行了必要的增强,以便可以在配置中选择它。叉子位于此处:
https://github.com/zepernick/CodeIgniter-Ion-Auth
我提出了一个拉取请求以将其包含在 Ion Auth 代码库中,但目前尚未被接受。关于它是否使代码变得复杂存在一些争论。如果对您有用,请给他们留言,让他们知道您想要此功能。
在 'identity' ion_auth 配置中使用 'email' 然后在ion_auth_model第866行的 $query 之后添加此代码
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']);
}
我认为更简单的方法是检查 $identity var 是否是电子邮件。如果不是电子邮件,则将该列设置为“用户名”。像这样的东西:
$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。
为我工作。
把它放在你的控制器上
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;
}
您可以在不修改核心代码的情况下执行此操作。如果存在有效的电子邮件,只需即时更改身份列。注意: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());
}
}