2015-01-09 4 views
1

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

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

я тогда класс User.php, который выглядит следующим образом:

<?php 

include('Password.php'); 

class User extends Password{ 

    private $db; 

    function __construct($db){ 
     parent::__construct(); 

     $this->_db = $db; 
    } 

    public function is_logged_in(){ 
     if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){ 
      return true; 
     }  
    } 

    private function get_user_hash($username){ 

     try { 

      $stmt = $this->_db->prepare('SELECT password FROM members WHERE username = :username'); 
      $stmt->execute(array('username' => $username)); 

      $row = $stmt->fetch(); 
      return $row['password']; 

     } catch(PDOException $e) { 
      echo '<p class="error">'.$e->getMessage().'</p>'; 
     } 
    } 


    public function login($username,$password){ 

     $hashed = $this->get_user_hash($username); 

     if($this->password_verify($password,$hashed) == 1){ 

      $_SESSION['loggedin'] = true; 

      return true; 
     }  
    } 


    public function logout(){ 
     session_destroy(); 
    } 

} 


?> 

, который, когда я использую var_dump($_SESSION); возвращения:

array(1) { ["loggedin"]=> bool(true) } 

То, что я хочу делать, это такие вещи, как «Привет,» (имя пользователя), «добро пожаловать в» (базовый, премиальный, администратор и т. Д.) «Область сайта».

так я думаю, что я хочу делать такие вещи, как $_SESSION['memberID'], $_SESSION['username'], $_SESSION['level']

так ... Прежде всего я смотрю на правой части, чтобы сделать этот вид вещи (User.php) и будет модифицировать что-нибудь я уже разрешите мне это сделать или мне нужно создать другую функцию (ы) и запросить базу данных и т. д. ... если я сделаю что-то вроде $_SESSION['username'] = 'mee';, тогда он отобразит «mee», но то, что я хочу сделать, это получить имя пользователя для любого пользователя, вошедшего в систему.

* извиняется заранее, если это не имеет смысла или смущает, iv пытался понять это в течение некоторого времени и буквально ничего не делает, делает смысл - перегрузка мозга:/

+0

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

+1

В целях безопасности разумно запрашивать базу данных для каждого последующего запроса в запрещенных зонах в вашей базе данных. Это может быть достигнуто путем простого хранения идентификатора пользователя в переменной сеанса и вытаскивания пользовательских данных с каждым запросом сохраненным идентификатором пользователя. Таким образом, если доступ отменяется, когда пользователь все еще регистрируется в системе, он будет отвечать правильно –

ответ

1

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

Эта функциональность может быть достигнута следующим образом:

// after successfully getting user by the provided username/password 
$_SESSION['logged_in_user_id'] = $user['id'] 

Теперь на каждый запрос вы просто проверить:

if (isset($_SESSION['logged_in_user_id'])) { 
    $currentUser = (new User())->find($_SESSION['logged_in_user_id']); 
} 

В вашей пользовательской модели вы могли бы сделать что-то вроде этого:

public function find($id) { 
    try { 

      $stmt = $this->_db->prepare('SELECT name, address, user_level, email FROM members WHERE id = :id'); 
      $stmt->execute(array('id' => $id)); 

      $row = $stmt->fetchAll(); 
      $user = new self(); 
      $user->fill($row[0]); 
      return $user; 

     } catch(PDOException $e) { 
      echo '<p class="error">'.$e->getMessage().'</p>'; 
     } catch (Exception $e) {} 

     return null; 
} 


public function fill(array $data) { 
    foreach ($data as $key => $value) { 
     $this->$key = $value; 
    } 
    return $this; 
} 

Для входа пользователя из:

unset($_SESSION['logged_in_user_id']); 

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

Теперь, с сессиями, вам нужно иметь в виду потенциал для session hijacking, но это еще одно обсуждение, и есть много пакетов PHP, чтобы помочь защитить эту уязвимость.


Если вы не связаны с безопасностью и просто хочу, чтобы получить его работу с минимальными усилиями, как это возможно (не рекомендуется) вы можете просто хранить массив данных пользователя в сеансе и использовать все, что вам нужно от это:

Вход код:

public function login($username,$password){ 

    if ($user = $this->getWithCredentials($username, $password) { 
     $_SESSION['logged_in_user'] = json_encode($user); 
     return true; 
    } 
    return false; 
} 

public function getWithCredentials($username, $password) { 

    try { 
     $hashedPassword = $this->myPasswordHashAlgorithm($password); 

     $stmt = $this->_db->prepare('SELECT id, name, address, email FROM members WHERE username = :username AND password = :password'); 
     $stmt->execute(array('username' => $username, 'password' => $hashedPassword)); 

     $row = $stmt->fetch(); 
     return $row; 

    } catch(PDOException $e) { 
     echo '<p class="error">'.$e->getMessage().'</p>'; 
    } catch (Exception $e) {} 

    return null; 


} 

Затем, чтобы получить данные пользователя при последующих запросах:

$user = isset($_SESSION['logged_in_user']) ? json_decode($_SESSION['logged_in_user'] : null; 
Смежные вопросы