2015-01-09 103 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;