Как публиковать не публиковать данные в сессии, когда пользователь входит в систему - PullRequest
0 голосов
/ 31 декабря 2010

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

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

Как мне сделать так, чтобы имя, фамилия и идентификатор появлялись в моей таблице сеансов в моей БД? Я хочу кое-что, как получить эти данные из базы данных, когда пользователь входит в систему, и предоставить ее в моем массиве $ u_data, чтобы он получил опубликованную информацию об успешной загрузке при загрузке.

Вот мой код:

<?php
class Login_Model extends CI_Model {


    public function checkLogin() {

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

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

            $u_data = array( //new variable with session data
                'user_id' => $this->db->insert_id(),
                'email' => $this->input->post('email'),
                'first_name' => $this->input->post('first_name'),
                'last_name' => $this->input->post('last_name'),
                'logged_in' => TRUE
            );

            $this->session->set_userdata($u_data); //send data from variable to db session
            return TRUE;

       } else {
            return FALSE;
       }
 }


   public function hashed() { //hashing method

            // sha1 and salt password
            $password = $this->encrypt->sha1($this->input->post('password')); //encrypt user password
            $salt = $this->config->item('encryption_key'); //grab static salt from config file

            $start_hash = sha1($salt . $password);
            $end_hash = sha1($password . $salt);
            $hashed = sha1($start_hash . $password . $end_hash);
            return $hashed;
}

}

alt text

Ответы [ 4 ]

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

Если вы отслеживаете сеансы в своей БД, на ум приходят два решения.

Сначала вы можете выбрать первый / последний из пользовательской таблицы и вставить ее в таблицу сеансов.Это требует изменений в вашем приложении.

Во-вторых, вы можете настроить представление для своего приложения, в котором таблица сеансов автоматически объединяется с соответствующим пользователем, но это предполагает, что у вас уже есть некоторый уникальный идентификатор, для которого пользовательэто в сеансе (это был адрес электронной почты? *).Это решение не потребует каких-либо изменений в коде приложения, но потребует изменений в БД, что может быть предпочтительным методом в зависимости от ваших требований к развертыванию (или может не быть :)).

* в качестве стороныУчтите, что если вы используете адреса электронной почты для уникальных идентификаторов, имейте в виду, что некоторые люди сообщают адреса электронной почты, когда вы решаете, подходит ли вам это решение.

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

Когда я работаю с системами аутентификации в CodeIgniter, я практиковал включение объекта «пользователь» глобально в представления, а также глобально в мои контроллеры, выбирая пользовательские данные в конструкторе, например так ...

<?php

class My_Controller extends Controller {

    private $the_user;  //global var to store current user data

    function My_Controller() {
        parent::Controller();

        $data->the_user = $this->ion_auth->get_user();       //get user data
        $this->load->vars($data);                  //load into all views as $the_user "$the_user"
        $this->the_user=$data->the_user;         //load into private class variable "$this->the_user"
    }

В этот момент объект переменной $ the_user по умолчанию доступен во всех представлениях, а $ this-> the_user всегда доступен для функций контроллера.Он всегда представляет пользователя, который в данный момент вошел в систему.

Я использую Ion_auth для аутентификации и извлечения пользователя, так что эту часть вы должны будете заполнить.«How-to» для реализации расширенных классов контроллеров, чтобы вся логика аутентификации автоматически наследовалась всем «защищенным» контроллерам.

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

Это было бы так же просто, как сделать что-то вроде:

session_start();
$_SESSION['userdata'] = $u_data;

в вашем методе CheckLogin.Сессия - это обычный PHP-массив, который автоматически сохраняется для вас.Вы можете положить в нее все, что захотите, но вы все же сами в нее вложите - PHP не сделает это за вас.

Комментарий:

Понятно.Таким образом, вы просто модифицируете свой класс, чтобы получать эту информацию из БД после аутентификации входа в систему.Я не знаю, как работает ваш класс БД, но вместо того, чтобы просто проверить, есть ли подходящая строка, извлеките имя / фамилию, используя запрос примерно так:

select firstname, lastname
from users
where email=$email and password=$password

Если вы получите результатстрока, вы знаете, что это действительный логин, а затем вы просто получаете данные имени.Я понятия не имею, как работает ваш класс БД, но не должно быть слишком сложно заставить его это сделать.

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

Следующий вопрос решил эту проблему для меня.Я посмотрел на один из моих старых вопросов здесь и использовал свой здравый смысл.

Я внес это изменение в свой код.

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

      $user = $query->result();

                $u_data = array( //new variable with session data
                    'user_id' => $user[0]->id,
                    'email' => $this->input->post('email'),
                    'first_name' => $user[0]->first_name,
                    'last_name' => $user[0]->last_name,
                    'logged_in' => TRUE
                );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...