انتقل إلى المحتوى الرئيسي

الفصل 4: دورة تكميلية

🎯 الأهداف​

  • تعميق المفاهيم مع الدورات التكميلية
  • استكشاف الوحدات 22 إلى 28 حول الأمان
  • إتقان الجوانب المتقدمة للمشروع

📚 المورد الرئيسي​

دورة تكميلية

جميع الدورات التكميلية متاحة في المستودع:

📖 مجلد الدورة

تركيز خاص على الوحدات 22 إلى 28 لجزء الأمان.


🗂️ هيكل الدورات​

يحتوي مجلد cours/ على سلسلة من الوحدات التقدمية:

نظرة عامة​

الوحدةالموضوعالوصف
01-10الأساسياتأساسيات المشروع، الإعداد، الهندسة المعمارية
11-18الأمان المفصلSpring Security خطوة بخطوة (انظر الفصل 5)
19-21API المتقدمةنقاط النهاية المعقدة، التحقق
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) →


العودة إلى فهرس الوحدة