اكتشف كيفية دمج هذه التقنيات مع عرض عملي.
التحكم في الوصول المستند إلى الدور هو آلية مصادقة آمنة. يمكنك استخدامه لتقييد الوصول إلى موارد معينة للمستخدمين الذين لديهم أدوار معينة.
يساعد هذا النوع من المصادقة مسؤولي النظام على التحكم في الأذونات وفقًا للأدوار المخصصة للمستخدمين. يضيف هذا المستوى من التحكم الدقيق طبقة من الأمان ، مما يسمح للتطبيقات بمنع الوصول غير المصرح به.
تنفيذ آلية التحكم في الوصول على أساس الدور باستخدام Passport.js و JWTs
يعد التحكم في الوصول المستند إلى الدور (RBAC) آلية شائعة تُستخدم لفرض قيود الوصول في التطبيقات بناءً على أدوار المستخدم والأذونات. هناك طرق مختلفة متاحة لتنفيذ آلية RBAC.
هناك طريقتان شائعتان تتضمن استخدام مكتبات RBAC مخصصة مثل AcessControl أو الاستفادة من مكتبات المصادقة الموجودة لتنفيذ الآلية.
في هذه الحالة ، توفر JSON Web Tokens (JWTs) طريقة آمنة لنقل بيانات اعتماد المصادقة ، بينما يبسط Passport.js عملية المصادقة من خلال توفير مصادقة مرنة الوسيطة.
باستخدام هذا الأسلوب ، يمكنك تعيين أدوار للمستخدمين وتشفيرهم في JWT عند قيامهم بالمصادقة. يمكنك بعد ذلك استخدام JWT للتحقق من هوية المستخدم وأدواره في الطلبات اللاحقة ، مما يسمح بالتخويل المستند إلى الدور والتحكم في الوصول.
كلا النهجين لهما مزايا ويمكن أن يكونا فعالين في تنفيذ RBAC. يعتمد الاختيار بين طريقة التنفيذ على المتطلبات المحددة لمشروعك.
يمكنك تنزيل كود هذا المشروع من موقعه مستودع جيثب.
قم بإعداد مشروع Express.js
للبدء، إنشاء مشروع Express.js محليًا. بمجرد إعداد المشروع ، انطلق وقم بتثبيت هذه الحزم:
npm install cors dotenv mongoose cookie-parser jsonwebtoken mongodb \
جواز سفر محلي
التالي، إنشاء قاعدة بيانات MongoDB أو إنشاء مجموعة في MongoDB Atlas. انسخ URI لاتصال قاعدة البيانات وأضفه إلى ملف .env ملف في الدليل الجذر لمشروعك لمشروعك:
CONNECTION_URI = "اتصال URI"
تكوين اتصال قاعدة البيانات
في الدليل الجذر ، قم بإنشاء ملف utils / db.js ملف ، وأضف الكود أدناه لتأسيس الاتصال بمجموعة MongoDB التي تعمل على Atlas باستخدام Mongoose.
مقدار ثابت النمس = يتطلب('النمس');
مقدار ثابت connectDB = غير متزامن () => {
يحاول {
انتظر mongoose.connect (process.env. CONNECTION_URI) ،
وحدة التحكم.سجل("متصل بـ MongoDB!");
} يمسك (خطأ) {
وحدة التحكم.خطأ("خطأ في الاتصال بـ MongoDB:"، خطأ)؛
}
};
وحدة.exports = connectDB؛
تحديد نموذج البيانات
في الدليل الجذر ، قم بإنشاء ملف النموذج / user.model.js ملف ، وأضف الكود التالي لتعريف نموذج بيانات لبيانات المستخدمين باستخدام Mongoose.
مقدار ثابت النمس = يتطلب('النمس');
مقدار ثابت userSchema = جديد النمس. مخطط({
اسم المستخدم: خيط,
كلمة المرور: خيط,
دور: خيط
});
وحدة.exports = mongoose.model ('مستخدم'، userSchema) ؛
قم بإنشاء وحدة التحكم لنقاط نهاية API
إنشاء ملف وحدات تحكم / user.controller.js ملف في الدليل الجذر وإضافة الكود أدناه.
أولاً ، قم بإجراء هذه الواردات:
مقدار ثابت المستخدم = يتطلب("../models/user.model");
مقدار ثابت جواز السفر = يتطلب('جواز سفر');
مقدار ثابت {createToken} = يتطلب("../middleware/auth");
يتطلب("../middleware/passport")(جواز سفر)؛
بعد ذلك ، حدد المنطق لإدارة تسجيل المستخدم ووظيفة تسجيل الدخول:
export.registerUser = غير متزامن (مطلوب ، الدقة) => {
مقدار ثابت {اسم المستخدم ، كلمة المرور ، الدور} = req.body؛يحاول {
انتظر User.create ({اسم المستخدم ، كلمة المرور ، الدور}) ؛
res.status (201) .json ({ رسالة: "تم تسجيل المستخدم بنجاح" });
} يمسك (خطأ) {
وحدة التحكم.log (خطأ) ؛
res.status (500) .json ({ رسالة: 'حدث خطأ!' });
}
};الصادرات.loginUser = (مطلوب ، الدقة ، التالي) => {
جواز السفر.'محلي', { حصة: خطأ شنيع } ، (يخطئ ، مستخدم ، معلومات) => {
لو (يخطئ) {
وحدة التحكم.log (يخطئ) ؛يعود res.status (500) .json ({
رسالة: "حدث خطأ أثناء تسجيل الدخول"
});
}لو (!مستخدم) {
يعود res.status (401) .json ({
رسالة: 'اعتماد تسجيل الدخول غير صالح'
});
}req.login (المستخدم ، { حصة: خطأ شنيع } ، (يخطئ) => {
لو (يخطئ) {
وحدة التحكم.log (يخطئ) ؛يعود res.status (500) .json ({
رسالة: "حدث خطأ أثناء تسجيل الدخول"
});
}
مقدار ثابت {_id، username، role} = user؛
مقدار ثابت الحمولة = { معرف المستخدم: _id ، اسم المستخدم ، الدور} ؛
مقدار ثابت رمز = إنشاء (حمولة) ؛
res.cookie ("رمز"، رمز ، { http فقط: حقيقي });
يعود res.status (200) .json ({ رسالة: "تسجيل الدخول ناجح" });
});
}) (مطلوب ، الدقة ، التالي) ؛
};
ال مستخدم تتعامل الوظيفة مع تسجيل مستخدم جديد عن طريق استخراج اسم المستخدم وكلمة المرور والدور من نص الطلب. يقوم بعد ذلك بإنشاء إدخال مستخدم جديد في قاعدة البيانات ويستجيب برسالة نجاح أو خطأ إذا حدث أي أثناء العملية.
من ناحية أخرى ، فإن تسجيل الدخول تسهل وظيفة تسجيل دخول المستخدم من خلال استخدام استراتيجية المصادقة المحلية التي يوفرها Passport.js. يصادق على بيانات اعتماد المستخدم ويعيد رمزًا مميزًا عند تسجيل الدخول الناجح والذي يتم تخزينه بعد ذلك في ملف تعريف ارتباط لطلبات المصادقة اللاحقة. في حالة حدوث أي أخطاء أثناء عملية تسجيل الدخول ، ستظهر الرسالة المناسبة.
أخيرًا ، أضف الكود الذي ينفذ المنطق الذي يجلب جميع بيانات المستخدمين من قاعدة البيانات. سنستخدم نقطة النهاية هذه كطريق مقيد للتأكد من أن المستخدمين المصرح لهم فقط بدور مسؤل يمكنه الوصول إلى نقطة النهاية هذه.
الصادرات.getUsers = غير متزامن (مطلوب ، الدقة) => {
يحاول {
مقدار ثابت المستخدمون = انتظر User.find ({}) ،
res.json (المستخدمون) ؛
} يمسك (خطأ) {
وحدة التحكم.log (خطأ) ؛
res.status (500) .json ({ رسالة: 'حدث خطأ!' });
}
};
قم بإعداد إستراتيجية المصادقة المحلية Passport.js
لمصادقة المستخدمين بعد تقديم بيانات اعتماد تسجيل الدخول الخاصة بهم ، تحتاج إلى إعداد استراتيجية مصادقة محلية.
إنشاء ملف الوسيطة / جواز السفر ملف في الدليل الجذر وإضافة التعليمات البرمجية التالية.
مقدار ثابت LocalStrategy = يتطلب("جواز سفر محلي").إستراتيجية؛
مقدار ثابت المستخدم = يتطلب("../models/user.model");وحدة.exports = (جواز سفر) => {
جواز السفر.
جديد LocalStrategy (غير متزامن (اسم المستخدم ، كلمة المرور ، تم) => {
يحاول {
مقدار ثابت المستخدم = انتظر User.findOne ({اسم المستخدم}) ،لو (!مستخدم) {
يعود منتهي(باطل, خطأ شنيع);
}لو (user.password! == كلمة المرور) {
يعود منتهي(باطل, خطأ شنيع);
}
يعود منتهي(باطل، مستخدم)؛
} يمسك (خطأ) {
يعود تم (خطأ) ؛
}
})
);
};
يحدد هذا الرمز إستراتيجية جواز السفر المحلي لمصادقة المستخدمين بناءً على اسم المستخدم وكلمة المرور المقدمين.
في البداية ، يستعلم عن قاعدة البيانات للعثور على مستخدم له اسم مستخدم مطابق ثم يواصل التحقق من صحة كلمة المرور الخاصة به. وبالتالي ، فإنه يقوم بإرجاع كائن المستخدم المصادق عليه إذا نجحت عملية تسجيل الدخول.
إنشاء برنامج وسيط للتحقق من JWT
داخل الوسيطة الدليل ، أنشئ ملف auth.js جديدًا ، وأضف الكود التالي لتعريف برمجية وسيطة تُنشئ JWTs وتتحقق منها.
مقدار ثابت جي دبليو تي = يتطلب("jsonwebtoken");
مقدار ثابت secretKey = process.env. SECRET_KEY ،مقدار ثابت جيلولدتوكين = (الحمولة) => {
مقدار ثابت token = jwt.sign (الحمولة ، secretKey ، { ينتهي في: "1 ساعة" });
يعود رمز.
};مقدار ثابت VerifyToken = (الدور المطلوب) =>(مطلوب ، الدقة ، التالي) => {
مقدار ثابت الرمز المميز = req.cookies.token ؛لو (! رمز) {
يعود res.status (401) .json ({ رسالة: "لا يوجد رمز مميز" });
}jwt.verify (رمز مميز ، مفتاح سري ، (خطأ ، فك ترميز) => {
لو (يخطئ) {
يعود res.status (401) .json ({ رسالة: "رمز غير صالح" });
}req.userId = decoded.userId ؛
لو (decoded.role! == الدور المطلوب) {
يعود res.status (403) .json ({
رسالة: "ليس لديك التخويل والأذونات للوصول إلى هذا المورد."
});
}التالي()؛
});
};
وحدة.exports = {createToken، verificationToken} ،
ال توليد تقوم الوظيفة بإنشاء JWT بوقت انتهاء صلاحية محدد ، بينما تحقق تتحقق الوظيفة مما إذا كان الرمز المميز موجودًا وصالحًا. بالإضافة إلى ذلك ، فإنه يتحقق أيضًا من أن الرمز المميز الذي تم فك ترميزه يحتوي على الدور المطلوب ، بشكل أساسي ، مما يضمن أن المستخدمين الذين لديهم الدور المصرح به والأذونات فقط لديهم حق الوصول.
للتوقيع على JWTs بشكل فريد ، تحتاج إلى إنشاء مفتاح سري فريد وإضافته إلى ملف .env ملف كما هو موضح أدناه.
SECRET_KEY = "هذا نموذج لمفتاح سري."
تحديد مسارات API
في الدليل الجذر ، قم بإنشاء مجلد جديد وقم بتسميته بالتوجيهات. داخل هذا المجلد ، قم بإنشاء ملف userRoutes.js، وأضف الكود التالي.
مقدار ثابت صريح = يتطلب('يعبر');
مقدار ثابت جهاز التوجيه = صريح. جهاز التوجيه () ؛
مقدار ثابت userControllers = يتطلب("../controllers/userController");
مقدار ثابت {VerifyToken} = يتطلب("../middleware/auth");router.post ("/ api / تسجيل"، userControllers.registerUser) ؛
router.post ('/ api / login'، userControllers.loginUser) ؛router.get ("/ api / المستخدمين"، verifyToken ('مسؤل') ، userControllers.getUsers) ؛
وحدة.exports = جهاز التوجيه ؛
يحدد هذا الرمز مسارات HTTP لواجهة برمجة تطبيقات REST. ال المستخدمين المسار على وجه التحديد ، الخوادم باعتبارها المسار المحمي. من خلال تقييد الوصول إلى المستخدمين بامتداد مسؤل دور ، تقوم بفرض التحكم في الوصول المستند إلى الدور بشكل فعال.
قم بتحديث ملف الخادم الرئيسي
افتح server.js ملف وتحديثه على النحو التالي:
مقدار ثابت صريح = يتطلب('يعبر');
مقدار ثابت كور = يتطلب("كورس");
مقدار ثابت cookieParser = يتطلب("محلل ملفات تعريف الارتباط");
مقدار ثابت التطبيق = صريح () ؛
مقدار ثابت المنفذ = 5000;
يتطلب("dotenv") .config () ؛
مقدار ثابت connectDB = يتطلب("./utils/db");
مقدار ثابت جواز السفر = يتطلب('جواز سفر');
يتطلب("./middleware/passport")(جواز سفر)؛connectDB () ،
app.use (express.json ()) ؛
app.use (express.urlencoded ({ ممتد: حقيقي }));
app.use (cors ()) ؛
app.use (cookieParser ()) ؛
app.use (جواز السفر. initialize ()) ؛مقدار ثابت userRoutes = يتطلب("./routes/userRoutes");
app.use ('/'، userRoutes) ؛
app.listen (المنفذ ، () => {
وحدة التحكم.سجل(`الخادم يعمل على المنفذ $ {منفذ}`);
});
أخيرًا ، ابدأ خادم التطوير لتشغيل التطبيق.
العقدة server.js
استفد من آلية RBAC للارتقاء بأنظمة المصادقة الخاصة بك
يعد تنفيذ التحكم في الوصول المستند إلى الأدوار طريقة فعالة لتعزيز أمان تطبيقاتك.
في حين أن دمج مكتبات المصادقة الحالية لإنشاء نظام RBAC فعال هو نهج رائع ، والاستفادة من مكتبات RBAC من أجل تحديد أدوار المستخدم بشكل صريح وتعيين الأذونات يوفر حلاً أكثر قوة ، مما يؤدي في النهاية إلى تعزيز الأمان العام الخاص بك طلب.