經驗交流

使用者權限控管(二)

問題說明
 如果我們要建置一套校務行政管理系統,裡頭不但需要區隔使用者的身份等級(校長、主任、教師、家長志工等),同等級的使用者之間還有使用權限之別的話(教務工作只能由教務人員處理),您得同時辨識使用者的身份與權限。

我的做法
 一開始,我們先評估整套系統中會有多少項子功能;若是 20 項的話,我們可以用英文字母來區分這些功能,例如:A 是公告管理、B 是課表管理、C 是教具管理、......。然後在每筆使用者的資料中加入 authority 這個欄位(型態為 CHAR,長度為 20),用來記錄各個使用者的權限範圍。
 假如某位使用者的權限是 ABDH,另一位使用者是 ACDG 的話,表示他們都可以操作 A 與 D 功能;但前者可以執行的 B 與 H 功能,則是後者所不能的。
 在使用者成功登入之後,我們用 $_SESSION["ssnAUTHORITY"] 來記錄其權限範圍,然後在各個程式中如下的檢查(以「公告管理」為例,使用者的權限中需有「A」字):
<?
// 啟用 Session
session_start();

// 將未登入、身份等級不足或不符者,導向至首頁
if ( empty($_SESSION["ssnUSERNAME"]) || $_SESSION["ssnUSERLEVEL"] >= 3 || strpos($_SESSION["ssnAUTHORITY"], "A") === false ) {
  Header("location:/index.html");
  exit;
}
?>

 您注意到了嗎?我在這裡使用了 ===
 這是因為 strpos 函數在搜尋字串位置時,找不到的話,會傳回 false;找到的話,則傳回所在位置。在這個例子中,若使用者的權限是 ABDH,則使用 strpos 函數尋找 A 的位置時,傳回值會是 0。這個 0 會被誤認為 false,所以我們得用 === 來區分它們之間的差異。
經驗交流