يا صاحبي، خلينا نتكلم شوية عن نظام التصميم اللي بيخليك تنام مرتاح 🧠⚙️
تخيل معايا لو عندك نظام فيه ملايين الريكوردز ومستخدمين بأدوار مختلفة: Admin، HR، Manager، User عادي… يعني حاجة عجيبة! كلهم بيشوفوا نفس الجدول، لكن مش نفس الداتا.
طيب، مثال بسيط بس قاتل. تخيل إنك تشوف قائمة الموظفين:
- تشوف قائمة الموظفين؟ تمام ✅
- تشوف المرتب؟ لأ ❌
- تشوف العنوان؟ ممكن
- تشوف الرقم القومي؟ حسب الدور
والباقي عليك، هنا تبدأ المصيبة 👀
لو كل مرة هتدخل تعمل:
if ($user->isAdmin()) {
select *
} else {
select name, email
}
أنت كده دخلت في جحيم: - كود مليان if/else - صعب يتصان - أي تغيير Permission = تعديل كود + Deploy - Bugs مالهاش آخر - Security holes لو نسيت شرط واحد 😬 وده مش System Design… ده عبث منظم.
المشكلة الحقيقية
المشكلة مش في الـ Users ولا في الـ Records، المشكلة إنك رابط الصلاحيات بالكود. والصح إنك تنقل الصلاحيات للداتا نفسها، مش للتطبيق.
الحل الذكي: Query-based Access Control 🧩
الفكرة العبقرية هنا إن الـ Admin هو اللي يحدد، مش الـ Developer. يعني إيه؟
الـ Admin عنده شاشة:
- بيكتب Query
- أو يختار Fields
- أو يحدد View
- ويربطها بـ User أو Role
مثلاً:
SELECT id, name, email, department
FROM employees
وده User عادي User تاني:
SELECT id, name, email, department, salary
FROM employees
بس كده. من غير ما تلمس سطر كود واحد 🔥
طيب التنفيذ بيكون إزاي؟
1️⃣ Row / Column Level Security
أنت عملياً بتعمل: - Dynamic Queries - SQL Views - Stored Queries محفوظة في DB والـ User بياخد Access على Query مش على Table
2️⃣ استخدام CTEs بذكاء 💡
في الباك إند: - تجمع كل الـ Queries المسموح بيها لليوزر - تدمجهم باستخدام WITH (CTE) - وتطلع Result واحدة نهائية
مثال مبسط:
WITH allowed_data AS (
-- queries user has access to
)
SELECT * FROM allowed_data;
كده: - اليوزر مهما حاول - مهما لعب في الـ Request - عمره ما يشوف غير اللي الـ Query سمحله بيه - Security by design 🔐
الميزة الخطيرة هنا 🔥
- ❌ مفيش if/else في الكود
- ❌ مفيش خوف إنك تنسى Field
- ✅ Permissions بتتغير Runtime
- ✅ Admin يضيف / يعدل من غير Deploy
- ✅ Scales بسهولة مع ملايين Records
وده بيفرق بين: - CRUD Developer 👶 - System Designer 🧔♂️🔥
طب ما العيوب؟ (عشان نكون صُرحا)
آه، الحل ده: - معقد شوية في الأول - محتاج Validation قوية على الـ Queries - لازم تمنع SQL Injection تماماً - محتاج Logging محترم
بس… - التعقيد هنا في مكانه الصح - مرة واحدة وتكسب نظام: - Secure - Flexible - Enterprise-ready
الخلاصة 🧠
لو نظامك: - فيه Data حساسة - Roles كتير - Permissions بتتغير - عايز تنام مرتاح
يبقى: - ما تربطش الصلاحيات بالكود - اربطها بالكويري - والساعة هتحس إن النظام بيشتغل معاك… مش ضدك 😎