سؤال

أنا باستخدام النصيبه مع النصيبه مصادقة مشروع بياني طبقة ولذلك متكاملة مع الربيع الأمن.هذا هو الأسلوب الذي يطلق عليه من قبل النصيبه للمصادقة بالنسبة لي:

@Override
public boolean authenticate(String username, String password) {
    try {
        Authentication request = new UsernamePasswordAuthenticationToken(
                username, password);
        Authentication result = authenticationManager.authenticate(request);
        SecurityContextHolder.getContext().setAuthentication(result);
    } catch (AuthenticationException e) {
        return false;
    }
    return true;
}

محتويات (في الداخل ) من ربيع الأمن تكوين XML هي:

<http path-type="regex">
    <form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
    <password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>

القسم 2.3.6.دورة التثبيت الهجوم الحماية من الوثائق المرجعية يقول:

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

  • migrateSession - يخلق دورة جديدة من النسخ الموجودة حاليا الدورة سمات الدورة الجديدة.هذا هو الافتراضي.
  • أي لا تفعل أي شيء.الأصلي الدورة سيتم الاحتفاظ بها.
  • newSession - إنشاء جديد "نظيف" الدورة دون نسخ القائمة بيانات الدورة.

المصادقة يعمل, ولكن أنا كما أنا جديدة إلى حد ما إلى الربيع الأمن لدي بعض الأسئلة التي تحتاج إجابات أيضا:

  • عادة لتسجيل الدخول, وأود أن نشر معلومات المصادقة على j_spring_security_check والسماح الربيع الأمن أداء الفعلية رمز التوثيق.أود الحصول على الحماية من دورة التثبيت الهجمات سوف أحصل عليه عندما كنت تنفيذ برنامجي تسجيل الدخول كما أفعل أنا ؟ و إذا لم يكن كذلك ، ماذا علي أن أفعل للحصول عليه ؟
  • كيف يمكنني تنفيذ برنامجي الخروج?
  • كما سيتم استخدام البرنامجي الدخول والخروج, كيف يمكنني تعطيل الربيع من اعتراض تلك URL ؟

تحديث: عن الدورة التثبيت الهجوم حماية يبدو أنني بحاجة إلى استدعاء الأسلوب في SessionUtils الدرجة مع التوقيع startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry).

كيف يمكنني الحصول على SessionRegistry سبيل المثال التي تحتاج إلى تمرير ؟ لا أستطيع أن أجد أي طريقة إنشاء اسم مستعار الهوية ، أو كيفية الحصول على بطاقة هوية أو اسم.

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

المحلول

ربما انها ليست كاملة الإجابة على الأسئلة الخاصة بك, ولكن ربما قد تساعدك.

رمز استدعائها عند عدم استخدام البرنامجي تسجيل الدخول, ولكن معيار واحد يمكن العثور عليها هنا:

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

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

وبالمثل رمز تنفيذها عند الوصول إلى /j_spring_security_logout في نهج موحد ، هي التي يمكن العثور عليها هنا:

org.springframework.security.ui.logout.LogoutFilter

على LogoutFilter مكالمات عدة معالجات.معالج نقوم باستخدام ما يسمى:org.springframework.security.ui.logout.SecurityContextLogoutHandler, لذا يمكن أن نسميه نفس القانون في النهج الخاص بك.

نصائح أخرى

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

إذا كنت ترى طريقة SessionUtils.startNewSessionIfRequired.

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

أما عن برنامجي الخروج لا يمكنك الذهاب بعيدا خاطئ ببساطة الاتصال session.invalidate() عندما تحتاج إلى تسجيل شخص.هذا وسوف نفعل كل ما هو ضروري من منظور الأمن ولكن نأخذ في الاعتبار على الرغم من أنك قد تحتاج إلى تنظيف بعض الأشياء على الدورة.إذا كان لديك معقدة للغاية مجموعة فلاتر إلخ.و كنت بحاجة للتأكد من أن المستخدم هو تسجيل الخروج لبقية الطلب ثم هل يمكن إضافة:

SecurityContextHolder.getContext().setAuthentication(null);

أما عن اعتراض url هل يمكن أن مجرد مجموعة منهم إلى شيء غير تجاهله!أنا لست متأكدا مما إذا كان يمكنك إيقاف اعتراض في التكوين - إذا كنت حقا ترغب في إزالته ثم إلقاء نظرة على AuthenticationProcessingFilter - يمكنك تخصيص هذا.إذا كنت تفعل هذا ثم سيكون لديك لإعداد الربيع الأمن xml و عدم استخدام توفير مساحات الأسماء.فإنه ليس من الصعب جدا على الرغم من - نظرة على بعض أقدم الوثائق و سترى كيفية القيام بذلك.

ويساعد هذا الأمل!

1) البرنامجية الخروج

  1. دعوة HttpServletRequest.getSession(كاذبة).يبطل
  2. دعوة SecurityContextHolder.clearContext()

2) أخبر الربيع الأمن لا اعتراض بعض عناوين, هذا النوع يعتمد على كيفية تطبيق url الفضاء هو الإعداد.إذا جميع الصفحات الخاصة بك (باستثناء /تسجيل الدخول /تسجيل الخروج) عاش في سياق /اسم التطبيق ثم يمكنك أن تفعل هذا:

<http ....>
  <intercept-url pattern="/myApp/**" ..>
 ....
</http>

كان لي مشكلة مع برنامجي تسجيل الدخول.دعوت جميع authenticationManager.authenticate(...) و SecurityContextHolder.getContext().setAuthentication(...) طرق ولكن لديها بعض المشاكل مع الدورة.لدي إضافة الأسطر التالية إلى إدارة بشكل صحيح الدورة:

HttpSession session = request.getSession();
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());

هذا لم يكن واضحا من التعليمة البرمجية الموجودة في المثال نشرت أعلاه.لمزيد من نظرة http://forum.springsource.org/showthread.php?t=69761

للقيام برنامجي الخروج ومن الممكن أيضا لرمي org.springframework.security.core.AuthenticationException.على سبيل المثال ، SessionAuthenticationException.في هذه الحالة ExceptionTranslationFilter الشروع في الخروج.

يمكنك أن تجرب هذا

    try {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        SecurityContextHolder.clearContext();

    } catch (Exception e) {
        logger.log(LogLevel.INFO, "Problem logging out.");
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top