:::

8-1 讓系統記住是否為管理員

  1. 已經做好簡單的登入機制後,必須要讓系統記住,這樣我們才能決定是否要顯示相關的管理工具。
  2. 一樣問一下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>

     

  3. 這次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;
    }
    

     

  4. 開啟 header.php,在最前面加入啟用 session 功能

    <?php
    session_start();
    require 'function.php';
    require 'vendor/autoload.php';
    
    ...略...

     

  5. 接著開啟 admin.php,在最前面加入判斷
    <?php
    require 'header.php';
    if (!is_admin()) {
        header('HTTP/1.0 403 Forbidden');
        echo "帳密錯誤,無法存取";
        exit;
    }
    
    // 過濾外部傳來變數
    $op = filter_input_var('op');
    
    ...略...

     

  6. 這樣就大功告成囉!
  7. 如果沒有附上登出功能,可以再請AI製作:
    請用PHP8製作登出功能 logout_admin()

     

  8. 得到如下函數:
    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;
    }

     


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D2031%26tbsn%3D55

計數器

今天: 3166316631663166
昨天: 2259225922592259
總計: 7951964795196479519647951964795196479519647951964