2017-03-15 76 views
0

我的程序有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>"; 

在每個頁面的頂部我有這個代碼是不同的基礎上,如果它的三種類型之一。

?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'的所有內容。 'Jack'和'Jill'都不能訪問與HR或供應商相關的任何內容。會話變量的那部分工作。

+0

您究竟如何存儲任何信息?如果您根據會話中的單個值(例如id)從數據庫中提取數據,則不會看到問題。由於您在設置標題之前打印了某些內容,因此重定向不起作用。 –

+0

您的數據庫不會將信息與用戶標識關聯嗎?你甚至存儲用戶ID嗎?這聽起來像是應用程序中的設計錯誤。 – Bytewave

+0

也許您應該重新考慮您的數據庫結構,您的案例中的用戶類型可以被視爲排名,並且用戶可以有多個排名。你可以在表中引入一個新的列,其中包含一個位標誌值。然後,您可以執行類似'$ usr-> rank&RANK_VENDOR'等操作。 – Xorifelse

回答

0

如何爲所有用戶使用相同的SESSION變量? Like $_SESSION["user_type"]= X;。然後你可以檢查這個變量。

0

我不知道是否可以創建多個會話,但您可以先在每個網頁的頂部閱讀user_type字段,如果它是合適的用戶,則可以保留,否則我應該重定向到正確的主頁。這樣,如果用戶HR類型「Vendor/vendorHome.php」與登錄時的行爲相同,則可以重定向用戶並防止vendorHome.php成爲其他用戶的讀者。

總是在BD中創建user_type字段,以便在會話中過濾用戶。

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']]) 

我想象上述查詢機制,您將需要用自己的替換它。

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"); 
     } 
+0

我試過,第一次我做到這一點,有一個問題,這就是爲什麼我切換到這種方式。 – jbfig

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 redirectons後,你應該總是停止與dieexit
  • 腳本執行這在邏輯上是更容易和更具建設性的設定值布爾(見第二個例子),而不是手動字符串標誌"set"需要每次手動檢查。
相關問題