Codeigniter - сопоставление введенного пользователем пароля с хешированным паролем, хранящимся в БД, всегда возвращает false.Пожалуйста помоги - PullRequest
0 голосов
/ 21 декабря 2010

У меня есть настройки контроллера моя join_model и мой логин_модель

Пользователь регистрируется, и после того, как он прошел все проверки, капчу и т. Д. И щелкнул "Отправить", он настроен на настройку.

Мой установочный контроллер загружает join_model и метод create (), берет все данные поста и готовится отправить их в базу данных. Это когда пароль, который они ввели в форму регистрации, получает хэшированный, соленый и т. Д.

После этого у меня есть оператор if, который проверяет, прошел ли пользователь метод checkLogin в login_model с TRUE. Этот метод находится в контроллере установки, и я назвал его loginValidated.

Если это ИСТИНА, то пользователь перенаправляется в личный кабинет (тире).

Когда я тестирую, меня продолжают отправлять на страницу с ошибкой. Я также изменил состояние if на (! This-> loginValidated ()), после чего меня перенаправили в область учетной записи, что означает, что пароли не должны совпадать.

Мне было интересно, может ли кто-нибудь быстро просмотреть мой код, чтобы узнать, замечают ли они, где я ошибаюсь?

<?php


class Setup extends Controller {

    public function index() {

        $this->load->model('join_model');
        $this->join_model->create();
        if ($this->loginValidated()) { //if user credentials passed validation

        redirect('dash'); //forward to dashboard
        }
        else {
            redirect('failed');
        }
    }
    public function loginValidated() {
        $this->load->model('login_model'); //load login_model model
        $this->login_model->checkLogin(); //load checkLogin method

    }
 }



<?php
//MY CONTROLLER

class Login_Model extends CI_Model {

    public function checkLogin() {
            return Join_Model::$u;

            $this->db->where('email', $this->input->post('email')); //compare db email to email entered in form
            $this->db->where('password', $u->password); //compare db password to password entered by user after hashing
            $query = $this->db->get('user'); // get the above info from 'user' table

            if ($query->num_rows == 1) { //if number of rows returned is 1

            $this->load->library('session');
            $this->session->set_userdata('user_id',$u->id);
            $this->session->set_userdata('username',$u->username);
            $this->session->set_userdata('first_name',$u->first_name);
            $this->session->set_userdata('last_name',$u->last_name);
            $this->session->set_userdata('logged_in', 'TRUE');

            return TRUE;
      }
   }
}


<?php
// MY JOIN MODEL

class Join_Model extends CI_Model {
    public static $u;
    public function create() {
                $this->load->helper('date');
                $this->load->library('encrypt');

  $u->first_name = $this->input->post('first_name');
                $u->last_name = $this->input->post('last_name');
                $u->email = $this->input->post('email');

                // sha1 and salt password
                $salt = $this->config->item('encryption_key');
  $password = $this->encrypt->sha1($this->input->post('password'));
                $start_hash = sha1($salt . $password);
                $end_hash = sha1($password . $salt);
                $hashed = sha1($start_hash . $password . $end_hash);
                $u->password = sha1($hashed);

                $u->birthday = $this->input->post('year') . '-' . $this->input->post('month') . '-' . $this->input->post('day');
                $u->sex = $this->input->post('sex');

                $u->created_at = date('Y-m-d H:i:s', now()); // date and time user joined the website

                $this->db->insert('user', $u);

    }
}

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Мой CI немного ржавый, но похоже, что вы возвращаете что-то в первой строке вашей checkLogin() функции, мне кажется, что приведенный ниже код не выполняется, тогда.

Кроме того, вам необходимо снова хешировать пароль перед отправкой в ​​базу данных, в противном случае вы сравниваете пароль в виде простого текста с хешем.

Кроме того, мне кажется, что вам нужен пользовательский контроллер и модель, а не модель для регистрации пользователя и входа в систему. Кроме того, вы должны воздерживаться от загрузки библиотек внутри вашей модели, это считается уродливым при работе с инфраструктурой MVC.

0 голосов
/ 21 декабря 2010

Вы хотите хешировать любой введенный пользователем пароль, а затем проверять хеш в базе данных, а не в необработанной строке, введенной пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...