تخزين تفاصيل المستخدم الذي تم تسجيل دخوله

StackOverflow https://stackoverflow.com/questions/20993

  •  09-06-2019
  •  | 
  •  

سؤال

عند إنشاء تطبيق ويب، ولنفترض أن لديك كائن مستخدم يشير إلى مستخدم واحد، ما رأيك في أفضل طريقة لتخزين تسجيل دخول المستخدم؟

هناك طريقتان فكرت فيهما:

  • تخزين معرف قاعدة بيانات المستخدم في متغير الجلسة
  • تخزين كائن المستخدم بأكمله في متغير الجلسة

هل هناك أي اقتراحات أفضل، أو أي مشكلات تتعلق باستخدام الطرق المذكورة أعلاه؟ربما مشكلات أمنية أو مشكلات في الذاكرة، وما إلى ذلك، وما إلى ذلك.

هل كانت مفيدة؟

المحلول

أوصي بتخزين المعرف بدلاً من الكائن.الجانب السلبي هو أنه يتعين عليك الوصول إلى قاعدة البيانات في كل مرة تريد فيها الحصول على معلومات هذا المستخدم.ومع ذلك، ما لم يتم احتساب كل مللي ثانية في صفحتك، فلا ينبغي أن يمثل الأداء مشكلة.هنا ميزتان:

  1. إذا تغيرت معلومات المستخدم بطريقة ما، فلن تقوم بتخزين معلومات قديمة في جلستك.على سبيل المثال، إذا تم منح مستخدم امتيازات إضافية من قبل المسؤول، فستكون تلك الامتيازات متاحة على الفور دون أن يحتاج المستخدم إلى تسجيل الخروج ثم تسجيل الدخول مرة أخرى.

  2. إذا تم تخزين معلومات الجلسة الخاصة بك على القرص الصلب، فيمكنك فقط تخزين البيانات القابلة للتسلسل.لذا، إذا كان كائن المستخدم الخاص بك يحتوي على أي شيء مثل اتصال قاعدة بيانات، أو مقبس مفتوح، أو واصف ملف، وما إلى ذلك، فلن يتم تخزين هذا بشكل صحيح وقد لا يتم تنظيفه بشكل صحيح أيضًا.

في معظم الحالات، لن تكون هذه المخاوف مشكلة وسيكون أي من النهجين جيدًا.

نصائح أخرى

من أجل الأمان، سأقوم بإنشاء معرف جلسة (إما GUID أو RNG آمن تشفيريًا) ولدي جدول يقوم فقط بتعيين معرفات الجلسة لمعرفات المستخدم.وبعد ذلك، ما عليك سوى تخزين معرف الجلسة في ملفات تعريف الارتباط الخاصة بهم، وجعله يعمل كوكيل لمعرف المستخدم.

|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|

مع هذا، لا يمكن لأي شخص انتحال شخصية مستخدم آخر عن طريق تخمين هويته.كما أنه يتيح لك تحديد جلسات المستخدمين بحيث يتعين عليهم تسجيل الدخول بين الحين والآخر (أسبوعان هو المعتاد).وإذا كنت تريد تخزين بيانات أخرى حول الجلسة، يمكنك فقط إضافتها إلى هذا الجدول.

فقط تذكر أنه إذا قمت بتخزين جميع سمات المستخدم (يمتد هذا إلى الأذونات) في الجلسة، فلن تصبح أي تغييرات على المستخدم سارية حتى يقوم بتسجيل الدخول مرة أخرى.

أنا شخصياً أقوم بتخزين الاسم والمعرف للرجوع إليه سريعًا، وأحضر الباقي عندما أحتاج إلى ذلك.

يعد تخزين المعرف هو أفضل ممارسة في معظم الحالات.أحد الأسباب المهمة لذلك هو قابلية التوسع.إذا قمت بتخزين كائن المستخدم (أو أي كيانات من قاعدة البيانات، بدلاً من معرفاتها فقط)، فسوف تواجه مشكلات في زيادة عدد الخوادم التي تخدم موقعك.لمزيد من المعلومات، ابحث في جوجل عن "هندسة لا شيء مشتركة".

أعتقد أن ذلك يعتمد على النظام الأساسي الذي تستخدمه.إذا كنت تستخدم ASP.net، فسألقي نظرة بالتأكيد على مصادقة النماذج class وجميع الوظائف المضمنة (والقابلة للتوسيع) هناك والتي يمكنك استخدامها لتخزين إعدادات المستخدم الذي قام بتسجيل الدخول.

سأقوم بتخزين قيمة مجزأة لمعرف المستخدم ومعرف الجلسة ثم مطابقتها في جدول الجلسات في قاعدة البيانات.بهذه الطريقة سيكون من الصعب تزييف بيانات الجلسة.هل يمكنني التحقق من IP أيضًا كفحص إضافي.

لست متأكدًا من رغبتي في الاعتماد على معرف المستخدم الذي يتم تخزينه في متغير الجلسة وأثق في أنه هذا المستخدم حيث يمكن تغييره بسهولة إلى حد ما والحصول على حق الوصول كعضو آخر

أقوم بتخزين المستخدم في الجلسة عادةً.يمكن حل مشكلة لا يمكن التغيير حتى تسجيل الدخول عن طريق استبدال الكائن الموجود في الجلسة بنسخة جديدة بعد إجراء التغييرات.

كائن المستخدم الخاص بنا خفيف الوزن إلى حد ما، لذا اخترنا تخزينه في متغير الجلسة.لست متأكدًا مما إذا كان هذا هو الأكثر كفاءة ولكنه يعمل بشكل جيد حتى الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top