මොඩියුලය 3

පරිපාලක පිවිසුම (Login) සහ උපකරණ පුවරුව (Dashboard)


1 සෙෂන්ස් (Sessions) සමඟ Login/Logout පද්ධතිය

පරිශීලකයෙක් ලොග් වූ පසු, ඔහු වෙබ් අඩවියේ විවිධ පිටු අතර ගමන් කරන විට ඔහුව හඳුනා ගැනීමට සෙෂන්ස් භාවිතා කරයි. එය හරියට සාදයකට ඇතුළු වන විට ඔබට දෙන අතේ බෑන්ඩ් එකක් වැනිය. ඔබ සාදය තුළ සිටින තුරු, එම බෑන්ඩ් එක නිසා ඔබව හඳුනාගත හැක.

ක්‍රියාවලිය:
  1. පරිශීලකයා පිවිසුම් ෆෝරමය පුරවා submit කරයි.
  2. සර්වර් එක, දත්ත සමුදායේ ඇති තොරතුරු සමඟ සසඳා ඒවා නිවැරදි දැයි පරීක්ෂා කරයි.
  3. තොරතුරු නිවැරදි නම්, සර්වර් එක `session_start()` මගින් සෙෂන් එකක් ආරම්භ කර, පරිශීලකයාගේ ID සහ role එක වැනි දත්ත `$_SESSION` විචල්‍යයේ ගබඩා කරයි.
  4. ඉන්පසු පරිශීලකයාව උපකරණ පුවරුව (dashboard) වෙත යොමු කරයි.
  5. පිටවීම (Logout) සඳහා, සෙෂන් එක `session_destroy()` මගින් විනාශ කර පිවිසුම් පිටුවට යොමු කරයි.
2 මුරපද හැෂ් කිරීම (Password Hashing)

ඉතා වැදගත්: කිසිවිටෙකත් මුරපද (passwords) සාමාන්‍ය TEXT ලෙස දත්ත සමුදායේ ගබඩා නොකරන්න. දත්ත සමුදාය හැකර්වරයෙකු අතට පත් වුවහොත්, සියලුම පරිශීලකයන්ගේ මුරපද ඔහුට දැකගත හැක.

ඒ වෙනුවට, අපි මුරපදය හැෂ් (hash) කරමු. මෙය එක්-මාර්ග ක්‍රියාවලියකි. එනම්, මුරපදයකින් හැෂ් එකක් සෑදිය හැකි නමුත්, හැෂ් එකකින් නැවත මුල් මුරපදය ලබාගත නොහැක.

මුරපදයක් හැෂ් කිරීම:
<?php $password = 'admin123'; $hashed_password = password_hash($password, PASSWORD_DEFAULT); // මෙම $hashed_password අගය දත්ත සමුදායේ ගබඩා කරන්න. ?>
ලොග් වන විට මුරපදය සත්‍යාපනය කිරීම:
<?php $submitted_password = 'admin123'; // ෆෝරමයෙන් ලැබෙන මුරපදය $hashed_password_from_db = '...'; // දත්ත සමුදායෙන් ලබාගත් හැෂ් එක if (password_verify($submitted_password, $hashed_password_from_db)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } ?>

⭐ ප්‍රායෝගික පැවරුම: Login පිටුව සහ Dashboard එක නිර්මාණය කිරීම

පියවර 1: පරිපාලක (Admin) පරිශීලකයෙක් ඇතුළත් කිරීම

පළමුව, අපට ලොග් වීමට පරිශීලකයෙක් අවශ්‍යයි. පහත PHP කේතය ක්‍රියාත්මක කර `'admin123'` යන මුරපදයට අදාළ හැෂ් එක ලබාගන්න. (ඔබට මෙය කිරීමට වෙනම PHP ගොනුවක් තාවකාලිකව සාදාගත හැක).

<?php echo password_hash('admin123', PASSWORD_DEFAULT); ?>

ඉහත කේතයෙන් ලැබෙන දිගු හැෂ් අගය copy කරගෙන, phpMyAdmin හි `users` වගුවට පහත SQL විධානය මගින් admin කෙනෙක් ඇතුළත් කරන්න. (ලැබුණු හැෂ් අගය 'YOUR_HASHED_PASSWORD_HERE' වෙනුවට ආදේශ කරන්න).

INSERT INTO `users` (`name`, `email`, `password`, `role`) VALUES ('Admin User', 'admin@supermarket.com', 'YOUR_HASHED_PASSWORD_HERE', 'admin');

පියවර 2: පිවිසුම් ෆෝරමය (`login.php`) සෑදීම

ඔබගේ `supermarket` ප්‍රධාන ෆෝල්ඩරය තුළ `login.php` නමින් ගොනුවක් සාදා පහත කේතය ඇතුළත් කරන්න.

<!DOCTYPE html> <html> <head> <title>Login</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body class="bg-light"> <div class="container"> <div class="row justify-content-center"> <div class="col-md-5 mt-5"> <div class="card"> <div class="card-header text-center"> <h3>Supermarket Login</h3> </div> <div class="card-body"> <form action="handle_login.php" method="POST"> <div class="mb-3"> <label for="email" class="form-label">Email</label> <input type="email" name="email" class="form-control" required> </div> <div class="mb-3"> <label for="password" class="form-label">Password</label> <input type="password" name="password" class="form-control" required> </div> <button type="submit" class="btn btn-primary w-100">Login</button> </form> </div> </div> </div> </div> </div> </body> </html>

පියවර 3: Login ක්‍රියාවලිය හැසිරවීම (`handle_login.php`)

`supermarket` ෆෝල්ඩරය තුළ `handle_login.php` නමින් ගොනුවක් සාදා පහත කේතය ඇතුළත් කරන්න.

<?php session_start(); include 'includes/db_connect.php'; if ($_SERVER["REQUEST_METHOD"] == "POST") { $email = $_POST['email']; $password = $_POST['password']; $sql = "SELECT id, name, password, role FROM users WHERE email = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $email); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if (mysqli_num_rows($result) == 1) { $user = mysqli_fetch_assoc($result); // Verify password if (password_verify($password, $user['password'])) { // Password is correct, start session $_SESSION['loggedin'] = true; $_SESSION['id'] = $user['id']; $_SESSION['name'] = $user['name']; $_SESSION['role'] = $user['role']; header("location: dashboard.php"); } else { echo "Invalid password."; } } else { echo "No account found with that email."; } mysqli_stmt_close($stmt); } mysqli_close($conn); ?>

පියවර 4: උපකරණ පුවරුව (`dashboard.php`) සහ පිටවීම (`logout.php`)

`dashboard.php` ගොනුව සාදන්න. මෙය ලොග් වූ පරිශීලකයින්ට පමණක් පිවිසිය හැකි පිටුවයි.

<?php session_start(); // If user is not logged in, redirect to login page if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true) { header("location: login.php"); exit; } ?> <!DOCTYPE html> <html> <head> <title>Dashboard</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <div class="mt-5"> <h1>Welcome, <?php echo htmlspecialchars($_SESSION["name"]); ?>!</h1> <p>Your role is: <strong><?php echo $_SESSION["role"]; ?></strong></p> <p>This is your dashboard.</p> <a href="logout.php" class="btn btn-danger">Logout</a> </div> </div> </body> </html>

අවසාන වශයෙන්, `logout.php` ගොනුව සාදන්න.

<?php session_start(); $_SESSION = array(); // Unset all session variables session_destroy(); // Destroy the session header("location: login.php"); exit; ?>

දැන් `http://localhost/supermarket/login.php` වෙත ගොස් ඔබ සෑදූ admin ගිණුමෙන් ලොග් වී බලන්න. ඔබව dashboard එක වෙත යොමු කරන්නේ නම්, ඔබ මෙම මොඩියුලය සාර්ථකව නිම කර ඇත!

‹‹ පෙර මොඩියුලය (Module 2) ඊළඟ මොඩියුලය (Module 4) ››