我如何使用会话来获取用户信息?

时间:2015-01-09 22:26:33

标签: php session

我正试图了解会议以及如何使用它们来显示用户数据并授予对网站区域的访问权等...

我在配置文件的开头有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) }

我想要做的事情就像&#34;你好,&#39;(人名用户名)&#39;欢迎来到&#39;(基本,高级,管理员等...)&#39;网站的区域&#34;。

所以我想我想做$_SESSION['memberID'], $_SESSION['username'], $_SESSION['level']

之类的事情

所以...首先,我正在寻找合适的区域来做这种事情(User.php)并且会修改我已经允许我这样做的任何东西,或者我是否需要创建另一个函数( s)并查询数据库等...如果我执行$_SESSION['username'] = 'mee';之类的操作,那么它将显示&#39; mee&#39;,但我想要做的是获取用户登录的用户名

如果这没有任何意义或令人困惑,请提前道歉* iv现在试图解决这个问题已经有一段时间了,而且实际上我没有做任何事情 - 脑过载:/

1 个答案:

答案 0 :(得分:1)

出于安全考虑,查询数据库以查找应用程序中受限区域的每个后续请求是明智的。这可以通过简单地将用户id存储在会话变量中并通过存储的用户id的每个请求拉取用户数据来实现。这样,如果在用户仍然登录时撤消访问,系统将正确响应

此功能可以这样实现:

// 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;