الفصل 4: دورة تكميلية
🎯 الأهداف
- تعميق المفاهيم مع الدورات التكميلية
- استكشاف الوحدات 22 إلى 28 حول الأمان
- إتقان الجوانب المتقدمة للمشروع
📚 المورد الرئيسي
دورة تكميلية
🗂️ هيكل الدورات
يحتوي مجلد cours/ على سلسلة من الوحدات التقدمية:
نظرة عامة
| الوحدة | الموضوع | الوصف |
|---|---|---|
| 01-10 | الأساسيات | أساسيات المشروع، الإعداد، الهندسة المعمارية |
| 11-18 | الأمان المفصل | Spring Security خطوة بخطوة (انظر الفصل 5) |
| 19-21 | API المتقدمة | نقاط النهاية المعقدة، التحقق |
| 22-28 | الأمان المتقدم | JWT، الأدوار، حماية المسارات |
🔐 التركيز: الوحدات 22 إلى 28 (الأمان)
تغطي هذه الوحدات الجوانب المتقدمة للأمان:
الوحدة 22: مقدمة في Spring Security
- التكوين الأساسي
- فلاتر الأمان
- AuthenticationManager
الوحدة 23: المصادقة عبر النموذج
- UserDetailsService
- PasswordEncoder
- تخزين المستخدمين
الوحدة 24: JWT (JSON Web Tokens)
- توليد الرموز
- التحقق من الرموز
- هيكل JWT
// هيكل JWT
{
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "user@example.com",
"iat": 1609459200,
"exp": 1609545600,
"roles": ["USER", "ADMIN"]
},
"signature": "..."
}
الوحدة 25: فلاتر المصادقة
- JwtAuthenticationFilter
- سلسلة فلاتر Spring Security
- OncePerRequestFilter
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7);
// التحقق من صحة الرمز والمصادقة
}
filterChain.doFilter(request, response);
}
}
الوحدة 26: التفويض بناءً على الأدوار
- @PreAuthorize
- @Secured
- hasRole() و hasAuthority()
@RestController
@RequestMapping("/api/admin")
public class AdminController {
@GetMapping("/leads")
@PreAuthorize("hasRole('ADMIN')")
public List<LeadDto> getAllLeads() {
return leadService.getAllLeads();
}
@DeleteMapping("/leads/{id}")
@PreAuthorize("hasRole('ADMIN')")
public void deleteLead(@PathVariable Long id) {
leadService.deleteLead(id);
}
}
الوحدة 27: حماية المسارات
- تكوين SecurityFilterChain
- نقاط النهاية العامة مقابل المحمية
- CORS و CSRF
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(csrf -> csrf.disable())
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(auth -> auth
// نقاط النهاية العامة
.requestMatchers("/api/contact").permitAll()
.requestMatchers("/api/auth/**").permitAll()
// نقاط النهاية المحمية
.requestMatchers("/api/admin/**").hasRole("ADMIN")
// كل الباقي يتطلب المصادقة
.anyRequest().authenticated()
)
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
الوحدة 28: اختبارات الأمان
- @WithMockUser
- اختبارات التفويض
- اختبارات المصادقة
@SpringBootTest
@AutoConfigureMockMvc
class SecurityTests {
@Autowired
private MockMvc mockMvc;
@Test
void adminEndpoint_withoutAuth_returns401() throws Exception {
mockMvc.perform(get("/api/admin/leads"))
.andExpect(status().isUnauthorized());
}
@Test
@WithMockUser(roles = "ADMIN")
void adminEndpoint_withAdmin_returns200() throws Exception {
mockMvc.perform(get("/api/admin/leads"))
.andExpect(status().isOk());
}
@Test
void publicEndpoint_withoutAuth_returns200() throws Exception {
mockMvc.perform(post("/api/contact")
.contentType(MediaType.APPLICATION_JSON)
.content("{...}"))
.andExpect(status().isOk());
}
}
📋 المفاهيم الرئيسية التي تم تناولها
هندسة الأمان
┌─────────────────────────────────────────────────────────┐
│ طلب HTTP │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ سلسلة فلاتر الأمان │
│ ┌───────────────────────────────────────────────────┐ │
│ │ 1. CorsFilter │ │
│ │ 2. CsrfFilter (معطل لـ API) │ │
│ │ 3. JwtAuthenticationFilter ◄─── التحقق من صحة الرمز │ │
│ │ 4. UsernamePasswordAuthenticationFilter │ │
│ │ 5. AuthorizationFilter ◄─── التحقق من الأدوار │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ المتحكم │
└─────────────────────────────────────────────────────────┘
تدفق مصادقة JWT
🛠️ تمارين عملية
التمرين 1: إضافة دور جديد
إضافة دور MANAGER يمكنه رؤية العملاء المحتملين ولكن لا يمكنه حذفهم.
التمرين 2: رمز مع انتهاء صلاحية مخصص
تعديل مدة صلاحية رمز JWT (مثال: ساعة واحدة بدلاً من 24).
التمرين 3: نقطة نهاية مع أدوار متعددة
إنشاء نقطة نهاية يمكن الوصول إليها بواسطة ADMIN و MANAGER.
@PreAuthorize("hasAnyRole('ADMIN', 'MANAGER')")
public List<LeadDto> getLeadsForManagers() {
// ...
}
📖 الوصول إلى الدورات
رابط مباشر
📚 الوصول إلى مجلد الدورة الكامل
راجع الوحدات 22 إلى 28 لفهم عميق لأمان Spring Boot.
⏭️ الخطوة التالية
الفصل التالي يغطي الأمان بمزيد من التفصيل مع الوحدات 11 إلى 18 من الملحقات:
الفصل 5: الأمان المتقدم (الوحدات 11-18) →