Spring Boot / المتوسط: البيانات والأمان وأدلة الإطار / الدرس 9
المصادقة وقواعد الطلب والوصول للكائن
ابنِ عقد أمان يفصل الهوية وصلاحية المسار وملكية الكائن و CSRF ومعالجة الفشل الآمنة.
في هذه الصفحة
أهداف الدرس
- تمييز المصادقة من التفويض.
- إعلان قواعد الطلب والدالة صراحة.
- اختبار منع المستأجر الآخر مستقلاً عن صحة المدخل.
الهوية بداية قرار الوصول
تنشئ المصادقة هوية موثوقة بآلية اعتماد مختارة، ويقرر التفويض أفعالها. لا يحق للمسجل قراءة كل منتج أو تعديل طلب مستأجر آخر تلقائياً. تحقق من الاعتماد بموفر مراجع واشتق النطاق من الهوية لا ترويسة أو حقل مستأجر يختاره الطالب.
قد ترفض سلسلة مرشحات Security الطلب قبل MVC والتحقق، فلا تمسك نصيحة المتحكم كل 401 و 403. حدد دخول المصادقة ومنع الوصول للواجهة واحم السبب التشخيصي مستقلاً. لا تسجل كلمة أورمز حامل أوالسياق كله لتفسير رفض؛ فالأثر الأمني ليس مبرراً لكشف الاعتماد.
أظهر المسارات المسموحة وبقية الحالات
يسمح المثال بصحة أساسية ويشترط catalog:read لقراءة المنتجات ويرفض الباقي. السلطة مطابقة حرفياً؛ ولـ hasRole اصطلاح بادئة فلا تستبدلها اعتباطياً. يحتاج الجزء موفر مصادقة ولا يقدم اعتماداً حقيقياً، ويبقى غير مشغّل بلا مستمع.
لا يجيز نشر الحالة كشف البيئة والمكونات التفصيلية؛ ستوضح سياسة Actuator ذلك. وإذا اختير Basic فعلياً لزم نقل آمن وعمر اعتماد مناسب. تغير السلسلة المخصصة توقعات الضبط، فاختبر السياسة كاملة ولا تفترض أن افتراضي Boot السابق يعالج بقية المسارات كما كان.
package training.catalog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
class ApiSecurity {
@Bean
SecurityFilterChain api(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(rules -> rules
.requestMatchers("/actuator/health").permitAll()
.requestMatchers(HttpMethod.GET, "/products/**").hasAuthority("catalog:read")
.anyRequest().denyAll())
.httpBasic(Customizer.withDefaults());
return http.build();
}
}
موفر الهوية سياقي ولم يعطل CSRF عاماً؛ ولم ينفذ المرشح أوالمصادقة.
افرض الملكية بعد إذن المسار
يجيب المسار عن دخول فئة طلبات وقد لا يثبت أن المنتج 42 ضمن مستأجر الطالب. تستطيع حماية الدالة تفويض القرار لقدرة مجال عند تمكينها، وتبقى قيود البحث والتعديل الموثوقة لازمة. لا يمكّن starter الأمان تفويض الدوال وحده، وتنطبق حدود الوكيل أيضاً.
يفحص النموذج المستقل السلطة ومقارنة المستأجر بالمورد، فيعطي صحيحاً للمطابق وخطأ لآخر ولغياب السلطة. يثبت سياسة منطقية لمدخل مصطنع لا مرشح Spring أواعتماداً أوكل تهديد. يحتاج كل حد دليله، ولا يجوز توسيع ادعاء نموذج محلي إلى أمان التطبيق الكامل.
public class Main {
static boolean canRead(String trustedTenant,java.util.Set<String> authorities,String resourceTenant) {
return trustedTenant!=null && trustedTenant.equals(resourceTenant) && authorities.contains("catalog:read");
}
public static void main(String[] args) throws Exception {
var read=java.util.Set.of("catalog:read");
System.out.println(canRead("north",read,"north"));
System.out.println(canRead("north",read,"south"));
System.out.println(canRead("north",java.util.Set.of(),"north"));
}
}
true
false
false
ينجح north لمورده وسلطته فقط، دون تنفيذ تكامل Security.
لا تخلط ضوابط المتصفح بالمصادقة
تحمي CSRF تدفقات اعتماد متصفح ذات صلة من طلب غير مقصود، وتضبط CORS الوصول بين الأصول؛ ولا تثبت أيهما الملكية. قد تكون 403 لطلب تعديل رفض CSRF لا كلمة خاطئة. لا تعطلها عاماً لإنجاح اختبار دون فهم نقل الاعتماد والعملاء.
قد تختار واجهة رمز بلا جلسة سياسة مختلفة مراجعة عن نموذج جلسة، ولا تكفي تسمية REST مبرراً. اختبر preflight والأصل والاعتماد وحدود الهوية مستقلة. تجنب سماحاً عاماً مع نموذج اعتماد غير مفسر، واجعل القرار ظاهراً في الضبط والاختبار بدلاً من إخفائه تحت افتراض شائع.
تحقق من المنع بعناية النجاح
اختبر المجهول والمصادق بلا سلطة والمخول والمستأجر الآخر والتالف و CSRF. تأكد أن المنع يسبق التعديل وأن الرد لا يكشف إلا المعتمد. تفيد هوية وهمية للسياسة ولا تثبت تحقق رمز إنتاج أو issuer/audience أوكلمة أوالنقل.
اختر MVC واعياً بالأمان للطلب ووحدة للملكية وتكاملاً معزولاً مخولاً للموفر حيث يلزم. لا يُشغّل موفر أو مستمع هنا. النتيجة عقد طبقات بدليل محدد، لا ادعاء أن annotation أو تسجيل دخول ناجح يؤمن كل مسار بيانات في التطبيق.
الأخطاء الشائعة وإصلاحها
كشف معرف صحيح منتج آخر.
- لماذا يحدث؟
- اختلط إذن المسار بملكية الكائن.
- كيف تصلحه؟
- افرض النطاق الموثوق في القراءة والكتابة.
- كيف تتجنب تكراره؟
- اختبر مستأجراً آخر بمعرف صحيح.
لم تعمل PreAuthorize.
- لماذا يحدث؟
- لم تفعل أو تجاوز النداء الحد.
- كيف تصلحه؟
- افحص التمكين والاستدعاء الفعلي.
- كيف تتجنب تكراره؟
- اختبر سياسة الوكيل.
عولجت 403 بتعطيل CSRF عاماً.
- لماذا يحدث؟
- أُخفي الرفض دون فهم التدفق.
- كيف تصلحه؟
- صنف السبب واختر سياسة مراجعة.
- كيف تتجنب تكراره؟
- طابق الاختبار بالعميل المدعوم.
اختبر فهمك
1. هل تثبت GET بهوية وهمية التحقق من رمز الإنتاج؟
اعرض الحل المشروح
لا؛ تفحص الإذن لتلك الهوية. تحتاج التوقيع والمصدر والجمهور والانتهاء والنقل وتكامل الموفر أدلة مستقلة.
2. ماذا يفعل النموذج لسلطة قراءة وهوية north ومورد south؟
اعرض الحل المشروح
يرفض؛ فالسلطة لا تكفي للمورد. افرض الملكية في المسار الفعلي وافحص غياب كشف أوتعديل ممنوع.
أهم ما تعلمته
- تختلف الهوية وإذن المسار والملكية.
- تحتاج حماية الدالة تمكيناً واعتراضاً فعلياً.
- للضابط المتصفحي والهوية الوهمية حدود دليل.