آموزش رایگان PHP

آموزش جامع پیاده‌سازی سطح دسترسی کاربران (ACL) در PHP

1405/05/14 22:17 محراب حسن زاده
آموزش جامع پیاده‌سازی سطح دسترسی کاربران (ACL) در PHP

مقدمه: چرا مدیریت سطح دسترسی اهمیت دارد؟

در دنیای وب، امنیت یکی از مهم‌ترین ستون‌های موفقیت هر سرویس یا اپلیکیشن است. فرقی نمی‌کند یک وب‌سایت شخصی کوچک داشته باشید یا یک پورتال سازمانی بزرگ؛ شما باید بتوانید دسترسی کاربران مختلف به بخش‌های مختلف سیستم را مدیریت کنید. به این فرآیند اصطلاحاً Authorization (مجوزدهی) یا به صورت عمومی‌تر، مدیریت سطح دسترسی کاربران گفته می‌شود.

دو مدل پرکاربرد برای مدیریت سطح دسترسی وجود دارد:

  • ACL (Access Control List): دسترسی‌ها را مستقیماً به کاربر یا به صورت لیستی ساده اختصاص می‌دهد.
  • RBAC (Role-Based Access Control): کنترل دسترسی بر اساس نقش‌ها (مانند مدیر، نویسنده، کاربر عادی) انجام می‌شود که روشی بسیار پایدارتر و استانداردتر است.

در این مقاله، ما از روش ترکیبی RBAC با پیاده‌سازی استاندارد در PHP استفاده خواهیم کرد.

طراحی بهینه دیتابیس (Database Design)

برای پیاده‌سازی یک سیستم سطح دسترسی پویا، نیاز به ۴ جدول اصلی داریم:

  1. users: اطلاعات پایه‌ای کاربران.
  2. roles: نقش‌های سیستم (مثل admin, editor, user).
  3. permissions: مجوزهای خاص (مثل edit_post, delete_post, write_post).
  4. role_permission: جدول واسط برای تخصیص مجوزها به نقش‌ها (رابطه چند به چند).

در ادامه ساختار کدهای SQL برای ایجاد این سیستم را مشاهده می‌کنید:


CREATE TABLE `roles` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE `permissions` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE `role_permission` (
  `role_id` INT,
  `permission_id` INT,
  PRIMARY KEY (`role_id`, `permission_id`),
  FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`permission_id`) REFERENCES `permissions`(`id`) ON DELETE CASCADE
);

CREATE TABLE `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(50) NOT NULL,
  `role_id` INT,
  FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`)
);

پیاده‌سازی کلاس دسترسی در PHP به صورت شی‌گرا

حالا زمان آن رسیده است که با استفاده از برنامه نویسی شی‌گرا (OOP) در PHP، کلاسی بنویسیم که وظیفه بررسی دسترسی‌ها را بر عهده بگیرد. این کلاس با متصل شدن به پایگاه داده از طریق PDO، مجوزهای مربوط به نقش کاربر را استخراج می‌کند.


class UserACL {
    private $db;
    private $userId;
    private $userPermissions = [];

    public function __construct($db, $userId) {
        $this->db = $db;
        $this->userId = $userId;
        $this->loadPermissions();
    }

    // دریافت تمام مجوزهای مربوط به کاربر جاری بر اساس نقش او
    private function loadPermissions() {
        $sql = "SELECT p.name FROM permissions p 
                JOIN role_permission rp ON p.id = rp.permission_id
                JOIN users u ON u.role_id = rp.role_id
                WHERE u.id = :user_id";
        
        $stmt = $this->db->prepare($sql);
        $stmt->execute(['user_id' => $this->userId]);
        $this->userPermissions = $stmt->fetchAll(PDO::FETCH_COLUMN);
    }

    // متد کلیدی برای بررسی وجود یک مجوز خاص
    public function hasPermission($permissionName) {
        return in_array($permissionName, $this->userPermissions);
    }
}

نحوه استفاده عملی در پروژه PHP

پس از تعریف کلاس فوق، به راحتی می‌توانید در هر صفحه‌ای از پروژه خود که نیاز به محدودسازی دسترسی دارد، مجوزها را بررسی کنید. به قطعه کد زیر دقت کنید:


// فرض کنید اتصال دیتابیس PDO برقرار است و شناسه کاربر در سشن ذخیره شده است
$db = new PDO('mysql:host=localhost;dbname=acl_demo', 'root', '');
$currentUserId = 1; // مقدار آزمایشی کاربر لاگین شده

$acl = new UserACL($db, $currentUserId);

// بررسی دسترسی برای حذف مقاله
if ($acl->hasPermission('delete_post')) {
    echo "شما مجاز به حذف این مطلب هستید.";
    // کد عملیات حذف در اینجا قرار می گیرد
} else {
    echo "خطای امنیتی: شما دسترسی لازم برای انجام این عملیات را ندارید!";
    exit();
}

نکات مهم امنیتی طبق استاندارد گوگل و OWASP

هنگام طراحی هر سیستم کنترلی در PHP، رعایت این سه نکته امنیت وب‌سایت شما را تضمین می‌کند:

  • اعتبارسنجی سمت سرور: هیچ‌گاه به بررسی‌های فرانت‌اند (مانند پنهان کردن دکمه‌ها با CSS یا JavaScript) اتکا نکنید. بررسی نهایی همواره باید سمت سرور انجام شود.
  • جلوگیری از SQL Injection: برای تمام کوئری‌های مربوط به دسترسی‌ها، حتماً از Prepared Statements (PDO یا MySQLi) استفاده کنید.
  • بهینه‌سازی کوئری‌ها (Caching): فراخوانی مداوم دیتابیس در هر لود صفحه می‌تواند سرعت سایت را کاهش دهد. بهتر است مجوزهای کاربر را پس از لاگین درون $_SESSION یا یک سیستم کش حافظه مثل Redis ذخیره کنید.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)
1405/05/04 23:40

آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)

مطالعه بیشتر
مقایسه کامل و جامع MySQLi و PDO در PHP: کدام یک برای پروژه شما مناسب‌تر است؟
1405/05/04 23:45

مقایسه کامل و جامع MySQLi و PDO در PHP: کدام یک برای پروژه شما مناسب‌تر است؟

مطالعه بیشتر
آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها
1402/06/10 18:07

آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها

مطالعه بیشتر
آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var
1402/06/18 22:41

آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var

مطالعه بیشتر
آموزش جامع اعتبارسنجی حجم و نوع فایل آپلودی در PHP طبق استانداردهای امنیتی گوگل
1405/05/01 20:20

آموزش جامع اعتبارسنجی حجم و نوع فایل آپلودی در PHP طبق استانداردهای امنیتی گوگل

مطالعه بیشتر
آموزش جامع توابع داخلی و پرکاربرد PHP + مثال‌های عملی
1405/04/16 01:18

آموزش جامع توابع داخلی و پرکاربرد PHP + مثال‌های عملی

مطالعه بیشتر
آموزش جامع دستور SELECT و نمایش اطلاعات دیتابیس طبق استانداردهای گوگل و سئو
1405/05/13 21:07

آموزش جامع دستور SELECT و نمایش اطلاعات دیتابیس طبق استانداردهای گوگل و سئو

مطالعه بیشتر
مفهوم متغیرها و انواع داده در جاوا اسکریپت: راهنمای جامع برای مبتدیان
1402/06/28 00:07

مفهوم متغیرها و انواع داده در جاوا اسکریپت: راهنمای جامع برای مبتدیان

مطالعه بیشتر
توابع فلش (Arrow Functions) در جاوا اسکریپت: ساده‌سازی کد با استفاده از ES6
1403/06/02 20:36

توابع فلش (Arrow Functions) در جاوا اسکریپت: ساده‌سازی کد با استفاده از ES6

مطالعه بیشتر
مقدمه‌ای بر CSS و نحوه اضافه کردن آن به HTML: راهنمای ساده و کامل برای مبتدیان
1402/06/04 23:43

مقدمه‌ای بر CSS و نحوه اضافه کردن آن به HTML: راهنمای ساده و کامل برای مبتدیان

مطالعه بیشتر
آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام
1403/08/01 20:16

آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام

مطالعه بیشتر
آموزش کامل توابع در PHP: از مقدماتی تا پیشرفته با استانداردهای گوگل
1405/04/16 01:02

آموزش کامل توابع در PHP: از مقدماتی تا پیشرفته با استانداردهای گوگل

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد