我的程序有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'可以做的一切。 “杰克”和“吉尔”都无法访问与人力资源或供应商相关的任何内容。那部分会话变量奏效了。
答案 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
重定向后,始终使用die
或exit
"set"
手动字符串标志,这在逻辑上更容易也更有建设性。