是否可以在会话中进行会话?

时间:2017-03-15 16:41:09

标签: php mysql session pdo session-variables

我的程序有3种用户类型。员工,人力资源和供应商。每当员工登录时,他/她只能访问员工可用的页面。

 if( $usr->userLogin() ) {

    echo "Welcome";
     if($usr->user_type == "Vendor") {
       $_SESSION['vend']='set';
      header("Location:Vendor/vendorHome.php");
    }
    else if($usr->user_type == "HR"){
      $_SESSION['hr']='set';
    header("Location:HR/hrHome.php");
}
  else {
    $_SESSION['emp']='set';
    header("Location:Employee/home.php");
  }
}
else {
    echo "Incorrect Username, Password, or User Type. Please Try<a href='index.php'> Again</a>";

在每个页面的顶部,我有这个代码,根据它是否是3种类型之一而不同。

?php
session_start();
if(!isset($_SESSION['vend'])) #If session is not set, user isn't logged in.
                             #Redirect to Login Page
       {
           header("Location:../index.php");
       }
?>

在编写此应用程序时,这不是问题,直到我意识到如果我将其他用户添加到任何类型,第二个用户能够访问第一个用户页面,信息和数据库中的所有内容。有没有办法根据用户声明第二个会话ID?如何根据用户类型和个人用户自己限制每个用户可用的信息?这有可能吗?我不知道每种类型会有多少用户,但我知道会有超过5个用户。

**编辑:**感谢您的建议。我将用它们改进我的代码。我不认为我正确地解释了我的问题。

假设我有2名员工类型'杰克'和'吉尔'的用户。 '杰克'通过了申请并添加了一些只有他应该看到或能够编辑和注销的表格。当'Jill'登录时,她不应该看到任何东西。事实并非如此。 'Jill'登录后,能够看到并编辑'Jack'可以做的一切。 “杰克”和“吉尔”都无法访问与人力资源或供应商相关的任何内容。那部分会话变量奏效了。

5 个答案:

答案 0 :(得分:0)

如何为所有用户使用相同的SESSION变量? 像$_SESSION["user_type"]= X;一样。然后你可以检查这个变量。

答案 1 :(得分:0)

我不知道是否可以进行多个会话,但您可以先在每个网页的顶部读取user_type字段,如果是正确的用户则可以保留,否则我应该重定向到正确的主页。这样,如果用户HR键入'Vendor / vendorHome.php',则您在登录时的相同行为可以重定向用户并阻止vendorHome.php成为其他用户的读者。

始终在BD中创建user_type字段,以便在会话中过滤您的用户。

答案 2 :(得分:0)

会话变量值已经是用户明智的。因此,如果为一个用户设置会话变量,则只为该用户设置它们。使用该网站的任何其他用户都不能拥有其他用户的价值。

您可能需要的是在会话中保存用户的ID以及您已保存的用户类型。我还建议将类型保存在一个会话变量中。

$_SESSION['user'] = // user's id from your db
$_SESSION['usertype'] = $usr->user_type;

然后简单地在页面顶部包含相同的功能,如下所示

function validateUser($type) {
    if(empty($_SESSION['usertype']) || $_SESSION['usertype'] != $type)
       header("Location:../index.php");
}

并且还在每页的顶部调用该函数

validateUser('vendor'); // and others for each page

还要确保在每个页面的顶部包含具有validateUser功能的文件。可能是这样的。

include('header.php');

至于向不同用户显示不同的数据,您将使用上面保存的会话用户ID并将其(安全地)添加到查询中,以仅向用户显示他们自己的数据。

makeDbQuery('SELECT * FROM foo WHERE user_id = ?', [$_SESSION['user']])

我想象了上面的查询机制,你需要用你自己的替换它。

答案 3 :(得分:0)

我会使用一个会话变量并将其值设置为用户的个人资料:

if( $usr->userLogin() ) {

    echo "Welcome";
     if($usr->user_type == "Vendor") {
       $_SESSION['user_type']='vendor';
      header("Location:Vendor/vendorHome.php");
    }
    else if($usr->user_type == "HR"){
      $_SESSION['user_type']='hr';
    header("Location:HR/hrHome.php");
}
  else {
    $_SESSION['user_type']='emp';
    header("Location:Employee/home.php");
  }
}

然后在每个页面中检查用户是否记录了他的用户类型/角色:

session_start();
if(!isset($_SESSION['user_type']) or $_SESSION['user_type'] !== 'vendor') // vendor, or hr ... 
       {
           header("Location:../index.php");
       }

答案 4 :(得分:0)

您的逻辑结构使用变量名称作为,因此您可以做两件事:

  • 设置单个变量以保存所有这些值。

  • 将这些值变量放入数组中。

第一个例子:

环境:

$_SESSION['usertype'] = "emp"; 
                      = "hr"; 
                      = "vend";

检查:

if($_SESSION['usertype'] !== "vend"){
                                    ...

第二个例子:

环境:

 $_SESSION['usertype']['emp'] = true/false; 
 $_SESSION['usertype']['hr'] = true/false; 
 $_SESSION['usertype']['vend'] = true/false;

检查:

if(!$_SESSION['usertype']['vend']){
                                   ...

这样做的一个优点是,您可以轻松地将成员同时设置为多个类别。

  • 在您的header重定向后,始终使用dieexit
  • 停止执行脚本
  • 将值设置为布尔值(参见第二个示例)而不是每次都需要手动检查的"set"手动字符串标志,这在逻辑上更容易也更有建设性。