لقد قمت مؤخرًا بتنفيذ Spring Security في تطبيق الويب الخاص بي القائم على Spring 4 / Hibernate للتعامل مع تسجيل الدخول/الخروج والأدوار المختلفة للمستخدمين. بعد الكثير من القراءة، يبدو أنه يعمل بشكل جيد الآن، ولكن لاحظت أن الاستثناءات التي يتم رميها بسبب تكوين خاطئ في Spring Security لم تتم معالجتها بشكل لائق باستخدام المعالج المخصص الخاص بي ولكن تظهر كصفحة خطأ قبيحة من Tomcat (تظهر HTTP Status 500 – UserDetailsService مطلوبة تليها كود المسار).
حل الخطأ الخاص بهذا الخطأ بالذات لم يكن صعبًا (إضافة userDetailsService(userDetailsService)
في تكوين RememberMe) ولكن الحقيقة تظل أن بعض الاستثناءات التي تم رميها لم يتم التعامل معها بواسطة الـ ControllerAdvice
الذي يظهر أدناه، حيث يتعامل مع MaxUploadSizeExceededException
وجميع الاستثناءات الأخرى في وقت التشغيل:
java@ControllerAdvice
public class ExceptionHandlingControllerAdvice {
public static final String DEFAULT_ERROR_VIEW = "genericerror";
@ExceptionHandler(value = MaxUploadSizeExceededException.class)
public View maxUploadSizeExceededExceptionHandler(HttpServletRequest req) throws IOException {
// كود المعالجة
}
@ExceptionHandler(value = RuntimeException.class)
public View defaultErrorHandler(HttpServletRequest req, Exception e) {
// كود المعالجة
}
}
ولكن يبدو أن الاستثناء الذي يتم رميه بسبب تكوين Security غير الكامل ربما لا يتم التقاطه بهذا الآلية لأن طلب الدخول POST يتم اعتراضه بواسطة Spring Security قبل استدعاء أي طريقة تحكم.
أرغب في عرض جميع الاستثناءات بطريقة لائقة على صفحة خطأ مخصصة، حتى تلك التي يتم رميها قبل أن يتم استدعاء أي تحكم. لا يمكنني العثور على الكثير من المعلومات حول ذلك، جميع تقنيات معالجة الأخطاء الموضحة في دليل Spring (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-exceptionhandlers) يبدو أنها تستخدم ControllerAdvice
.
هل هناك وسيلة ملائمة للتعامل مع جميع الاستثناءات بطريقة عامة؟ وهل يجعل ذلك الـ ControllerAdvice
الخاص بي للتعامل مع الاستثناءات غير ضروري؟
المزيد من المعلومات
بالطبع، دعني أقدم لك مزيدًا من المعلومات حول كيفية التعامل مع الاستثناءات بشكل عام في بيئة Spring Security.
عندما يتم رمي استثناءات خلال عملية المصادقة أو التفويض في Spring Security، فإنه يقوم بتوجيه هذه الاستثناءات إلى منظومة التشغيل الخاصة به، والتي تعتمد على افتراضات معينة. لكن، قد تكون تلك الاستثناءات خارج نطاق التعامل الطبيعي مع الأخطاء في التطبيق.
لحل هذه المشكلة، يمكنك تكوين فئة خاصة تمتد من ResponseEntityExceptionHandler
وتعالج الاستثناءات بشكل عام لتغطي كل الطلبات. في هذه الحالة، ستتم معالجة الاستثناءات حتى إذا حدثت قبل استدعاء أي تحكم. يمكنك فعل ذلك على النحو التالي:
java@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity