تقييم الدرس 17
تنفيذ الأدوار والصلاحيات في الخادم
أجب عن الأسئلة ثم اضغط «صحّح ورقتي» في آخر الصفحة. ← العودة إلى الدرس
أسئلة التقييم
تقييم الدرس 17: تنفيذ الأدوار والصلاحيات في الخادم. إجاباتك تُحفظ تلقائيًّا على هذا الجهاز؛ أجب ثم اضغط «صحّح ورقتي».
1السؤال الأول: اختر الإجابة الصحيحة
1) أي وسيط يعرف المستخدم من رمزه؟
2) مستخدم بلا رمز يطلب مسارًا محميًّا. الرد:
3) متدربة تطلب الاعتماد. الرد حسب المصفوفة:
4) أي سطر أفضل للتحقق من التقرير المالي؟
5) أين تظهر صلاحيات الأدوار في كود الدرس؟
2السؤال الثاني: صح أم خطأ
1)
authorize يجب أن يأتي قبل authenticate.الصواب: خطأ
2) شرط الملكية يحتاج النظر في البيانات نفسها.
الصواب: صح
3) حماية كل مسارات /
api افتراضيًّا تجعل نسيان الوسيط أقل خطرًا.الصواب: صح
4) إضافة صلاحية لدور تتطلب تعديل كل المسارات إن استخدمنا
can.الصواب: خطأ
5) من لا يملك صلاحية قراءة الطلبات يُفضّل أن يأخذ 403.
الصواب: صح
3السؤال الثالث: أكمل الفراغات من القائمة المنسدلة
1) الدالة التي تسأل هل يملك المستخدم صلاحية معينة في كود الدرس هي .
الإجابة: can
2) بعد نجاح الوسيط يُستدعى لينتقل الطلب إلى التالي.
الإجابة:
next()3) حماية كل المسارات تحت /
api بالمصادقة تكتب .الإجابة:
app.use('/api', authenticate)4السؤال الرابع: أسئلة عملية
1) ماذا يرد الخادم على طلب سارة؟ GET /api/reports/finance
const express = require('express');const app = express();app.use(express.json()); // من مصفوفة الصلاحيات (الدرس 16) إلى الكود مباشرةconst ROLE_PERMS = { trainee: ['course:read', 'enrollment:create', 'enrollment:read:own'], trainer: ['course:read', 'attendance:record'], registrar: ['course:read', 'enrollment:read', 'enrollment:approve'], manager: ['course:read', 'enrollment:read', 'report:finance', 'user:manage'],};const users = [ { id: 1, name: 'سارة', role: 'trainee' }, { id: 2, name: 'نورة', role: 'registrar' }, { id: 3, name: 'أ. فهد', role: 'manager' }, { id: 4, name: 'خالد', role: 'trainer' },];// رموز دخول مبسطة للتجربة؛ في النظام الحقيقي JWT كما في مقرر أطر الويبconst tokens = { 'tok-sara': 1, 'tok-noura': 2, 'tok-fahad': 3, 'tok-khaled': 4 }; // 1) المصادقة: من أنت؟function authenticate(req, res, next) { const t = (req.headers.authorization || '').replace('Bearer ', ''); const user = users.find(u => u.id === tokens[t]); if (!user) return res.status(401).json({ error: 'سجّل الدخول أولًا' }); req.user = user; next();} // 2) التفويض: هل يحق لك؟const can = (user, perm) => (ROLE_PERMS[user.role] || []).includes(perm);function authorize(perm) { return (req, res, next) => can(req.user, perm) ? next() : res.status(403).json({ error: 'لا تملك الصلاحية ' + perm });} app.get('/api/reports/finance', authenticate, authorize('report:finance'), (req, res) => { res.json({ month: '2026-10', revenue: 12500 });}); app.listen(3000);
الاستجابة الصحيحة:
{"error":"لا تملك الصلاحية report:finance"}2) ماذا يرد الخادم على طلب خالد (مدرب)؟ GET /api/enrollments
const express = require('express');const app = express();app.use(express.json()); // من مصفوفة الصلاحيات (الدرس 16) إلى الكود مباشرةconst ROLE_PERMS = { trainee: ['course:read', 'enrollment:create', 'enrollment:read:own'], trainer: ['course:read', 'attendance:record'], registrar: ['course:read', 'enrollment:read', 'enrollment:approve'], manager: ['course:read', 'enrollment:read', 'report:finance', 'user:manage'],};const users = [ { id: 1, name: 'سارة', role: 'trainee' }, { id: 2, name: 'نورة', role: 'registrar' }, { id: 3, name: 'أ. فهد', role: 'manager' }, { id: 4, name: 'خالد', role: 'trainer' },];// رموز دخول مبسطة للتجربة؛ في النظام الحقيقي JWT كما في مقرر أطر الويبconst tokens = { 'tok-sara': 1, 'tok-noura': 2, 'tok-fahad': 3, 'tok-khaled': 4 }; // 1) المصادقة: من أنت؟function authenticate(req, res, next) { const t = (req.headers.authorization || '').replace('Bearer ', ''); const user = users.find(u => u.id === tokens[t]); if (!user) return res.status(401).json({ error: 'سجّل الدخول أولًا' }); req.user = user; next();} // 2) التفويض: هل يحق لك؟const can = (user, perm) => (ROLE_PERMS[user.role] || []).includes(perm);function authorize(perm) { return (req, res, next) => can(req.user, perm) ? next() : res.status(403).json({ error: 'لا تملك الصلاحية ' + perm });} const enrollments = [ { id: 1, traineeId: 1, course: 'تصميم الويب', status: 'pending' }, { id: 2, traineeId: 5, course: 'قواعد البيانات', status: 'pending' }, { id: 3, traineeId: 6, course: 'تصميم الويب', status: 'approved' },]; app.get('/api/enrollments', authenticate, (req, res) => { if (can(req.user, 'enrollment:read')) return res.json(enrollments); // كل الطلبات if (can(req.user, 'enrollment:read:own')) // الخاصة به فقط return res.json(enrollments.filter(e => e.traineeId === req.user.id)); res.status(403).json({ error: 'لا تملك الصلاحية' }); // المنع افتراضيًّا}); app.listen(3000);
الاستجابة الصحيحة:
{"error":"لا تملك الصلاحية"}أجب عن الأسئلة ثم اضغط «صحّح ورقتي».