ACEGI يلقي AuthenticationCredentialSnotFoundException عند فتح عنوان URL مع BrowserLauncher 2

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

سؤال

لدينا تطبيق ويب JSF يستخدم أمان ACEGI. لدينا أيضا تطبيق Java Swing مستقل. تتمثل إحدى وظائف تطبيق Swing في تحميل الصفحة الرئيسية للمستخدم في نافذة المتصفح.

للقيام بذلك ، نستخدم حاليًا Commons HTTPClient لمصادقة المستخدم مع تطبيق الويب:

String url = "http://someUrl/j_acegi_security_check";
HttpClient client = new HttpClient();
System.setProperty(trustStoreType, "Windows-ROOT");
PostMethod  method = new PostMethod(url);
method.addParameter("j_username", "USERNAME");
method.addParameter("j_password", "PASSWORD");
int statusCode = client.executeMethod(method);
if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY ) {
    Header locationHeader= method.getResponseHeader("Location");
    String redirectUrl = locationHeader.getValue();
    BrowserLauncher launcher = new BrowserLauncher();
    launcher.openURLinBrowser(redirectUrl);
}

هذا يعيد استجابة إعادة توجيه HTTP 302 ، والتي نأخذ منها عنوان URL إعادة التوجيه ونفتحه باستخدام BrowserLauncher 2. يحتوي عنوان URL على معرف الجلسة الجديد ، وهو أمر مثل:

http://someUrl/HomePage.jsf;jsessionid=C4FB2F643CE48AC2DE4A8A4C354033D4

المشكلة التي نراها هي أن ACEGI يعالج إعادة التوجيه ولكنه يلقي مصادقة credentialsnotfoundException. يبدو أنه لسبب ما لا يمكن العثور على بيانات الاعتماد المصادقة في سياق الأمان.

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

شكرا جزيلا،

ريتشارد

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

المحلول

لم أقم مطلقًا بإنجاز ACEGI/SpringSecurity ، لكن الأعراض واضحة بما يكفي: بعض المعلومات المهمة مفقودة في الطلب. تحتاج على الأقل إلى التحقيق في جميع رؤوس الاستجابة إذا لم يكن هناك شيء جديد الاحتياجات ليتم تمريرها مرة أخرى في رأس الطلب اللاحق. ربما إدخال ملف تعريف الارتباط آخر يمثل بيانات اعتماد ACEGI.

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

نصائح أخرى

في هذه الحالة ، يمكنك القيام بالمصادقة الأساسية وتعيين هذا الرأس في كل طلب بدلاً من إرسال jsessionid:

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

الرمز المميز vvnfuk5btuu6ueftu1dpukq = هو اسم المستخدم وكلمة المرور المشفرة BASE64.
مثال:

scott:tiger 

هو:

c2NvdHQ6dGlnZXI=

شيء آخر: استخدم SSL.

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