طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 241 · تحليل وتصميم برمجيات الويب
تقييم الدرس 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":"لا تملك الصلاحية"}
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس