Этот ответ может быть неправильным, поскольку он требует некоторых предположений.
Допущения:
- Существует только одна «роль» на пользователя
- Значение
$userInfo->role
представляет собой строку
- Контроллер, на которого вы хотите отправить авторизованного пользователя, это
main
- Методы контроллера
main
называются так же, как и «роль», например.
«подписчик», «админ», «клиент», «почтальон»
Если что-либо из перечисленного неверно, тогда этот ответ не сработает.
Вот мое предлагаемое решение. Я сделаю комментарии после этого кода.
public function login()
{
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
$this->form_validation->set_rules('password', 'Password', 'required');
if($this->form_validation->run())
{
$post = $this->input->post();
//$clean = $this->security->xss_clean($post);
$userInfo = $this->user_model->checkLogin($post);
if( ! $userInfo)
{
$this->session->set_flashdata('flash_message', 'The login was unsucessful');
redirect('main/login');
}
$this->session->set_userdata($userInfo);
redirect('main/'.$userInfo->roles);
}
$this->load->view('header');
$this->load->view('login');
$this->load->view('footer');
}
Вам, наверное, интересно, почему я все переставил. Ну, в основном потому, что это устраняет необходимость в else
, чтобы идти с if
. Меньше кода - это хорошо - верно?
Вызов redirect()
завершает выполнение скрипта , означая, что любой код после redirect
не будет выполняться. Потому что кодовый блок if($this->form_validation->run()){
заканчивается вызовом redirect
, где заканчивается эта функция. Итак, вам не нужно else
. В случае неудачного выполнения проверки перейдите прямо к представлению загрузки кода.
Ваш синтаксис для redirect
неверен. redirect()
создаст URL на основе значений вашего файла конфигурации. ( документы здесь ) Итак, убедитесь, что $config['base_url']
установлен правильно.
Ваш код
redirect(site_url().'main/');
должно быть написано
redirect('main/');
Вы, наверное, заметили, что я закомментировал строку
$clean = $this->security->xss_clean($post);
Большинство разработчиков будут утверждать, что предотвращение XSS должно быть сделано на выходе, а не на вводе. (Больше, чем вы хотите знать о предотвращении XSS ЗДЕСЬ .)
Поскольку входные данные используются для выбора записи в БД, кажется, что значения экранированы, и вы не сохраняете входные данные, поэтому опасности нет. Использование xss_clean()
является ресурсоемким и бесполезным в этом случае.
Я удалил следующую петлю
foreach ($userInfo as $key => $val)
{
$this->session->set_userdata($key, $val);
}
и изменил его на
$this->session->set_userdata($userInfo);
Если вы посмотрите на код set_userdata()
и обнаружите, что он в значительной степени использует тот же код, который вы создали. (Код находится в /system/core/Session/Session.php
вокруг строки 785.) Оставайтесь DRY и используйте набор инструментов платформы. set_userdata()
примет ассоциативный массив и сделает то, что вам нужно.
Поскольку значение $userInfo->roles
является строкой, которая соответствует имени метода, который вы хотите перенаправить на этот вызов, это поможет.
redirect('main/'.$userInfo->roles);
Если main
не правильный контроллер, измените его выше. Если имена методов не соответствуют значениям роли, потребуется дополнительный код.
Надеюсь, это понятно и полезно.