أمن الربيع
Spring Security هو إطار أمان يمكن أن يوفر حلولًا شاملة لمكافحة الوصول الآمن لمشاريع J2EE. يعتمد على مرشحات servlet. تعترض هذه المرشحات الطلبات الواردة وتنفيذ بعض معالجة الأمان قبل معالجة الطلب على الطلب.
يعترض أمان الربيع طلبات المستخدم على النحو التالي:
خلفية
في مشروع منفصل عن الطرف الأمامي والخلفي ، يتم استخدام SpringSecurity كإطار أمان ، ويتم استخدام JWT لتنفيذ إدارة الإذن لتحسين أمان واجهة برمجة التطبيقات المريحة. أول شيء واجهته هو مشكلة المجال المتقاطع ، ولكن أثناء عملية حمل طلب JWT ، لم يتمكن الخادم من الحصول على JWT.
قضايا النطاقات المتقاطعة
أثناء عملية التطوير ، واجهت مشكلة CORS (مشاركة موارد النطاق عبر المجال). أقوم ببساطة بإعداد وصول عبر المجال على جانب الخادم ، ولكن حدث أثناء عملية حمل طلب JWT.
نظرًا لأنه يتم وضع JWT في رأس الطلب ، فإنه يتجاهل أن معالجة المجال المتقاطع هي إضافة حقل الرأس الذي يسمح بتعيينه.
COMPONENTPublic Class CORSFILTER تنفذ FILTER {logger logger = loggerfactory.getLogger (corsfilter.class) ؛ Override public void init (filterConfig filterConfig) يلقي servleTexception {} Override public void dofilter (servletRequest servletrequest ، servletResponse servletResponse ، filterChain filterchain) يلقي ioException ، servleTexception {httpsprequest = httpservletresponse استجابة = (httpservletresponse) servletResponse ؛ Response.Setheader ("Access-Control-Opping-Origin" ، request.getheader ("Origin")) ؛ استجابة. //response.setheader("Access-control-methods"،"post،get،options،delete-put ") ؛ // طريقة الطلب المسموح بها للاستجابة. استجابة. // طريقة الطلب المسموح بها للاستجابة. // طريقة الطلب المسموح بها للاستجابة. // ما إذا كنت للسماح للطلبات باستخدام معلومات التحقق من filterchain.dofilter (servletRequest ، servletResponse) ؛ } Override public void Dorner () {}} ذكر البحث عبر الإنترنت أنه كان من الضروري معالجة طلبات الخيارات وإرجاع 200 ، لكن الاختبار لم ينجح
طلب الخيارات هنا هو في الواقع طلب Preplight
طلب المبدئي
لكن لم يتم حل المشكلة ، على النحو التالي
فقط بعد Google ، يُعرف عن المعلومات المتعلقة بطلب المبدئي
عندما نسمي واجهة الخلفية ، غالبًا ما نجد أننا طلبنا مرتين. في الواقع ، في المرة الأولى التي نرسل فيها طلب المبدئي (طلب المبدئي).
لماذا تحتاج إلى طلب Preplight
نعلم جميعًا أن سياسة الأصل من نفس المتصفحات هي أنه لأسباب أمنية ، ستقيد المتصفحات طلبات HTTP عبر المجال المتبدل من البرامج النصية. يتبع XMLHTTPREQUEST وجلب جميعهم سياسة الأصل من نفس.
هناك عمومًا طريقتان للمتصفحات لتقييد طلبات النطاق المتقاطع:
يقيد المتصفح إصدار طلبات النطاق المتقاطع وطلبات المجال المتقاطع. يمكن بدء طلبات المجال المتقاطع بشكل طبيعي ، ولكن يتم اعتراض النتيجة التي تم إرجاعها بواسطة المتصفح.
بشكل عام ، تقيد المتصفحات طلبات المجال المتقاطع بالطريقة الثانية ، أي أن الطلب قد وصل إلى الخادم وقد يعمل على البيانات في قاعدة البيانات. ومع ذلك ، يتم اعتراض النتيجة التي تم إرجاعها بواسطة المتصفح ، لذلك لا يمكننا الحصول على نتيجة العودة. هذا طلب فاشل ، ولكن قد يكون له تأثير على البيانات في قاعدة البيانات.
من أجل منع حدوث ذلك ، تتطلب المواصفات أنه بالنسبة لطريقة طلب HTTP هذه التي قد يكون لها آثار جانبية على بيانات الخادم ، يجب على المتصفح أولاً استخدام طريقة الخيارات لبدء طلب Preflight لمعرفة ما إذا كان الخادم يسمح لطلب المجال المتقاطع: إذا سمح بها ، إرسال طلب حقيقي مع البيانات ؛ إذا لم يكن مسموحًا ، منع إرسال طلب حقيقي مع البيانات.
يقسم المتصفح طلبات CORS إلى فئتين: الطلبات البسيطة والطلبات غير البسيطة.
طلب بسيط
1. طريقة الطلب هي واحدة من الطرق الثلاث التالية
2. معلومات الرأس من HTTP لا تتجاوز الحقول التالية
أي شخص لا يفي بالشرطين أعلاه في نفس الوقت هو طلب غير بسيط.
يتولى المتصفح هذين الطلبين بشكل مختلف.
لا يوجد طلب بسيط
طلب غير بسيط هو طلب يحتوي على متطلبات خاصة للخادم ، مثل طريقة الطلب أو حذفه ، أو نوع حقل نوع المحتوى هو التطبيق/JSON.
سيؤدي طلب CORS الذي ليس طلبًا بسيطًا إلى إضافة طلب استعلام HTTP قبل الاتصال الرسمي ، والذي يسمى طلب "Preplight" (Preflight)
لمزيد من الإشارة التفصيلية إلى CORS ، يرجى الرجوع إلى الرابط الموجود في الأسفل
حل
في خلفيتنا ، يتم استخدام أمان الربيع كإطار أمان ولا يتم إجراء أي معالجة مماثلة لطلب المبدئي ، لذلك سيؤدي هذا الطلب إلى فشل التحكم في الإذن.
كما أنها بسيطة للغاية للمعالجة. ما عليك سوى إضافة طلب إصدار Preflight إلى طريقة تكوين فئة SPRING Security.
Override محمي باطل التكوين (httpsecurity http) يلقي الاستثناء {http // لأننا نستخدم jwt ، لا نحتاج csrf .csrf (). disable () // بناءً على الرمز المميز ، لا نحتاج إلى جلسة. يتم إصدار جميع الطلبات لـ/requestmatchers (corsutils :: isPreflightrequest) .permitall () // preflight.antmatchers ("/*"). permanly () .antmatchers ("/u"). denyall () .antmatchers ("/article/**"). antall (). .antmatchers ("/api/**"). permanly () .antmatchers ("/v2/api-docs" ، "/configuration/ui" ، "/swagger-resources/**" ، "/configuration/**" ،"/swagger-ui.html" ، "/webjars/**". "/configuration/ui" ، "/swagger-resources/**" ، "/configuration/**"،"/swagger-ui.html" ، "/webjars/**") .permitall () .antmatchers ("/manage/**"). المصادقة. anyrequest (). مصادقة () ؛ // تعطيل cache http.headers (). cachecontrol () ؛ // إضافة JWT Filter http.addfilterbefore (antanketicationTokenFilterbean () ، usernamepasswordauthenticationfilter.class) ؛ // إضافة المعالجة غير المصرح بها http.exceptionHandling (). المصادقة (GetAuthenticationEntryPoint ()) ؛ // أذونات غير كافية معالجة http.exceptionHandling (). AccessDeniedHandler (getAccessdeniedHandler ()) ؛ }تم حل المشكلة أخيرًا!
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.
الرجوع إلى:
الواجهة الأمامية | مناقشة موجزة حول طلب المبدئي
مشاركة الموارد عبر المجال