:::
8-1 讓系統記住是否為管理員
- 已經做好簡單的登入機制後,必須要讓系統記住,這樣我們才能決定是否要顯示相關的管理工具。
- 一樣問一下AI:
請製作一個PHP8的is_admin()函數,該函數會在每一個php檔前執行,用來判斷是否有登入。登入機制是透過以下的.htaccess來登入,並以bcrypt 加密方式建立帳號,登入後請紀錄到session,以便其他地方用來判斷是否有登入? <Files admin.php> AuthType Basic AuthName "Restricted Area" AuthUserFile "C:/UniServerZ/www/php8/.htpasswd" Require valid-user </Files> - 這次AI貼心的產生了兩個函數,
is_admin()用來判斷,logout_admin()用來登出,我們可將之放在function.php的最後面:<?php session_start(); function is_admin() { // 如果 session 中已有登入狀態,直接返回 true if (isset($_SESSION['is_admin']) && $_SESSION['is_admin'] === true) { return true; } // 檢查 HTTP 認證 if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) { return false; } $username = $_SERVER['PHP_AUTH_USER']; $password = $_SERVER['PHP_AUTH_PW']; // 讀取 .htpasswd 文件 $htpasswd_path = "C:/UniServerZ/www/php8/.htpasswd"; $htpasswd_content = file_get_contents($htpasswd_path); $lines = explode("\n", $htpasswd_content); foreach ($lines as $line) { $parts = explode(':', $line); if (count($parts) == 2) { $stored_username = trim($parts[0]); $stored_hash = trim($parts[1]); if ($username === $stored_username && password_verify($password, $stored_hash)) { // 認證成功,設置 session $_SESSION['is_admin'] = true; $_SESSION['admin_username'] = $username; return true; } } } return false; } function logout_admin() { // 清除 session unset($_SESSION['is_admin']); unset($_SESSION['admin_username']); session_destroy(); // 清除 HTTP 認證 header('WWW-Authenticate: Basic realm="Restricted Area"'); header('HTTP/1.0 401 Unauthorized'); exit; } -
開啟
header.php,在最前面加入啟用 session 功能<?php session_start(); require 'function.php'; require 'vendor/autoload.php'; ...略... - 接著開啟
admin.php,在最前面加入判斷<?php require 'header.php'; if (!is_admin()) { header('HTTP/1.0 403 Forbidden'); echo "帳密錯誤,無法存取"; exit; } // 過濾外部傳來變數 $op = filter_input_var('op'); ...略... - 這樣就大功告成囉!
- 如果沒有附上登出功能,可以再請AI製作:
請用PHP8製作登出功能 logout_admin() - 得到如下函數:
function logout_admin() { // 清除所有 session 變數 $_SESSION = array(); // 如果使用了 session cookie,現在刪除它 if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 銷毀 session session_destroy(); // 清除 HTTP 基本認證 header('WWW-Authenticate: Basic realm="Restricted Area"'); header('HTTP/1.0 401 Unauthorized'); // 可選:重定向到登入頁面或首頁 header('Location: index.php'); // 或者 header('Location: index.php'); exit; }
8. 開始加入管理功能