Я знаю, что могу настроить 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 = "электронная почта";
Никаких изменений в модели или библиотеке или пользовательских запросах не требуется.
без необходимости редактирования 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:
Недавно я разветвил Ion Auth и сделал необходимые улучшения, чтобы это можно было выбрать в конфигурации. Вилка находится здесь:
https://github.com/zepernick/CodeIgniter-Ion-Auth
Я предложил запрос на добавление, чтобы включить его в кодовую базу Ion Auth, но в настоящее время он не принят. Были некоторые споры о том, делает ли это код сложным. Пожалуйста, напишите им записку и сообщите, что вам нужна эта функция, если она вам полезна.
https://github.com/benedmunds/CodeIgniter-Ion-Auth/pull/746
используйте «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']);
}
Я думаю, что проще было бы проверить, является ли переменная $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.
Работает на меня.
Поместите это на свой контроллер
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());
}
}