Я знаю, что могу установить разрешение для входа в систему по имени пользователя в конфиге, я также знаю, что могу настроить его для входа по электронной почте в конфиге.
Есть ли простой способ установить его для использования автоматически?
Если по автоматическому, вы имеете в виду попробовать один, а затем другой, чтобы увидеть, дает ли либо действительный доход:
Вход выполняется в строке 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 и сделал необходимые улучшения, чтобы это можно было выбрать в конфигурации. Вилка находится здесь:
https://github.com/zepernick/CodeIgniter-Ion-Auth
Я предложил запрос на перенос, чтобы включить его в базу кода Ion Auth, но в настоящее время он не принят. Происходили некоторые дебаты о том, превратил ли этот код в сложный. Пожалуйста, бросьте им заметку и сообщите им, что вам понравится эта функция, если она вам полезна.
без необходимости редактировать 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:
используйте 'email' в 'identity' ion_auth config, затем добавьте этот код после $ 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 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()); } }