سؤال

أقوم بإنشاء تطبيق ويب باستخدام Stripes وSpring.يجب أن يكون لديه ميزة تسجيل الدخول/المصادقة.أقوم الآن بتخزين معلومات المستخدم بشكل منفصل عن بيانات اعتماد المستخدم في قاعدة البيانات.لا يحتوي نموذج المستخدم الخاص بي على بيانات الاعتماد لأنني لا أريد تمرير كلمات مرور قيمة.

يدير Spring جميع DAO الخاصة بي.

الآن، أقوم بتنفيذ نظام أمني غير قائم على الحاويات.أقوم بتخزين تجزئة كلمة المرور sha-2 وإجراء مقارنة بين كلمة المرور التي تم تقديمها في النموذج وما تم تخزينه في قاعدة البيانات.لقد تم اختبار هذه المقارنة وهي ناجحة.أحاول معرفة كيفية ربط هذا الشيء معًا.لدي الآن LoginActionBean الذي يلتقط طلبات تسجيل الدخول ويستخدم مفردة "PasswordService" التي تستخدم UserDAO داخليًا لاسترداد بيانات الاعتماد وإجراء المقارنة مع المعلمات المرسلة.فاصوليا الربيع الخاصة بي هي:

<bean id="passwordSerivce" class="com.example.store.authentication.PasswordService" factory-method="getInstance">
    <property name="userDAO" ref="userDAO"/>
</bean>

ولكن بعد ذلك يحتاج المفرد كلمة المرور إلى ما يلي:

public void setUserDAO(UserDAO userDAO) { ...}

الطريقة التي لا معنى لها حقًا في المفرد (UserDAO عبارة عن واجهة).

أنا أبحث عن التصميم المناسب.لقد قرأت أن ServiceLocators هي السبب وراء اختراع Spring.أي أفكار؟

أود أيضًا أن أعرف كيف يمكنني تصميم هذا.لدي ActionBean يتم استدعاؤه عندما ينقر المستخدم على "تسجيل الدخول"، ولكن كيف يمكنني المصادقة فعليًا.هل أقوم بإدخال خدمة المصادقة في الحبة؟هل أقوم بإنشاء نغمة مفردة يمكن لأي شخص الاتصال بها؟هل لدي واجهة عامة يستخدمها LoginAcionBean والتي يقوم Spring بحقنها؟إذا لم أكن أستخدم الربيع، فكيف سيتم ذلك؟

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

المحلول

  1. لا أفهم لماذا ليس من المنطقي حقن userDao.

  2. لا أفهم سبب استخدام ملف XML الخاص بك Factory-method="getInstance";يمكنك التخلص من جميع العناصر المثيلة والأشياء الفردية؛سيقوم Spring بإنشاء مثيل واحد لفئة خدمة كلمة المرور وإدخاله في العديد من الفئات التي تحتاج إليها، وسيحصلون جميعًا على نفس المثيل.لذا فإن الربيع يخلق لك أغنية مفردة.يمكن أن تكون فئة خدمة كلمة المرور بمثابة لعبة بسيطة.وبالمثل بالنسبة لتنفيذ userDao.

أنصح أيضًا بالاطلاع على التعليقات التوضيحية الربيعية وفهمها واستخدامها.بشكل أساسي، يمكنك استخدام @Service في الفصل الذي سيتم حقنه، ثم استخدام @Autowired على أداة الضبط في الفصل الذي سيتم حقنه فيه.تحتاج أيضًا إلى إضافة شيء ما إلى ملف تكوين xml الخاص بك لتشغيل عناصر التعليقات التوضيحية.

نصائح أخرى

وإضافة إلى الإجابة أعلاه، ومجرد استخدام حقن منشئ إذا كنت لا تريد واضعة لDAO:

<bean id="passwordSerivce" class="...PasswordService">
   <constructor-arg ref="userDAO"/>
</bean>

وإذا لم الفول ليس درجة التي تحكم، لا تحتاج لجعله سينغلتون، والربيع القيام بذلك عن طريق الافتراضي.

وأنا شخصيا لست من محبي شروحه.

وكان لي الحل لديك واجهة مع أسلوب "مصادقة". ثم إنشاء فئة الخدمة التي تطبق الواجهة مع منشئ التي تأخذ في كائن UserDAO. بهذه الطريقة، الكائن الذي يتطلب خدمة لا مثيل أداء (يتم ذلك بحلول الربيع) ويجهل ما يتم تنفيذ تنفيذ الأساسي (LDAP، SSO، مقارنة كلمة السر بسيط، الخ). يبدو أن انجاز هذه المهمة: P

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