البرمجة

تعامل متقن مع الاستثناءات في Spring Security

لقد قمت مؤخرًا بتنفيذ 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 handleAllExceptions(Exception ex, WebRequest request) { // يمكنك هنا تنسيق الرد بالطريقة التي تناسب تطبيقك return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } }

يُفضل استخدام ResponseEntity لتحديد بنية الرد بشكل دقيق ومرونة أكبر.

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

إذا كنت تفضل التحكم في استثناءات Spring Security بشكل محدد، يمكنك استخدام AuthenticationEntryPoint الخاص بك للتعامل مع استثناءات المصادقة، و AccessDeniedHandler للتعامل مع استثناءات التفويض.

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

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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