2015-01-09 102 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';那麼它會顯示'我',但我想要做的是得到用戶名登錄。

*提前道歉,如果這沒什麼意義或令人困惑,iv一直試圖弄清楚一段時間現在和字面上什麼都沒有做有意義 - 大腦過載:/

+0

用戶登錄後將變量添加到會話數組,然後您可以在任何啓動會話的頁面中使用它們。確保在用戶註銷時清除會話陣列。每個用戶將獲得他們自己的一組會話變量。 – 2015-01-09 22:30:52

+1

出於安全考慮,謹慎地向數據庫查詢數據庫中每個對限制區域的後續請求。這可以通過將用戶標識存儲在會話變量中並通過存儲的用戶標識的每個請求來拉取用戶數據來實現。這樣,如果在用戶仍然登錄時訪問被撤銷,系統將會正確響應 – 2015-01-09 22:32:48

回答

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;