Bir kütüphane REST API'sine kimlik doğrulama (authentication) ve yetkilendirme (authorization) ekleyeceksin. Kullanıcılar kayıt olur, şifreleri BCrypt ile hash'lenir; kitap ekleme sadece LIBRARIAN rolüne açıkken, kitap listeleme herkese açıktır. Süre: ~5-7 saat.
Bu hafta odak: Spring Security (session-based), rol bazlı erişim, şifre hash'leme ve birim testi (Mockito + MockMvc).
JpaRepositoryveDTOartık serbest.
Controller ──> Service ──> Repository (JpaRepository) ──> H2
▲
SecurityFilterChain (kimlik + yetki: /books POST = LIBRARIAN)
CustomUserDetailsService (kullanıcıyı DB'den yükler)
BCryptPasswordEncoder (şifre hash)
entity/—User(username, hash'li password, role),Book(isbn, title),Roleenum (USER,LIBRARIAN)repository/—UserRepository,BookRepository(JpaRepository)dto/—RegisterRequest,BookRequest(@Validdoğrulama hazır)security/SecurityConfig—SecurityFilterChain+BCryptPasswordEncoderbean'isecurity/CustomUserDetailsService— DB'den kullanıcı yükleme (rol →ROLE_*yetkisi)controller/GlobalExceptionHandler— hataları 400'e çevirirapplication.properties
AuthService.register(TODO 1-3): kullanıcı adı çakışıyorsaIllegalArgumentException; şifreyipasswordEncoder.encode(...)ile hash'le (asla düz metin!);Useroluşturup kaydet.BookService(TODO 4-5):create(kaydet+döndür),findAll.AuthController(TODO 6-8):POST /register→201; yanıtta şifreyi DÖNDÜRME (sadece id/username/role).BookController(TODO 9-10):GET /books(liste),POST /books→201.
💡 Yetki kuralı zaten
SecurityConfig'de:POST /books→hasRole("LIBRARIAN"). Controller'da ekstra kontrol yazmana gerek yok — Spring Security isteği daha controller'a gelmeden 401/403 ile reddeder.
mvn spring-boot:run # http://localhost:8080
# Kayıt (herkese açık):
curl -i -X POST localhost:8080/register -H "Content-Type: application/json" \
-d '{"username":"ayse","password":"sifre123","role":"LIBRARIAN"}'
# Kitap listele (herkese açık):
curl -i localhost:8080/books
# Kitap ekle — kimlik gerekir (HTTP Basic). LIBRARIAN ise 201, USER ise 403:
curl -i -u ayse:sifre123 -X POST localhost:8080/books -H "Content-Type: application/json" \
-d '{"isbn":"978-1","title":"Temiz Kod"}'
# Kimliksiz POST → 401:
curl -i -X POST localhost:8080/books -H "Content-Type: application/json" \
-d '{"isbn":"978-2","title":"X"}'- Spring Security:
SecurityFilterChain,httpBasic, rol bazlıauthorizeHttpRequests - Şifre güvenliği:
PasswordEncoder(BCrypt) ile hash; düz metin saklamama UserDetailsServiceile DB tabanlı kimlik doğrulama (verilen kodu oku, anla)- Birim testi: Mockito (
@Mock/@InjectMocks, servis mantığı) + MockMvc (@WithMockUser, rol bazlı erişim)
13 test var: AuthServiceTest + BookServiceTest (Mockito, servis mantığı), SecurityTest (MockMvc, 401/403/201 + rol). 1. student_id.txt'ye Kaizu numaranı yaz. 2. mvn test. 3. 13/13 olunca panelde yeşil tik (skor otomatik gider).
Kısmi çalıştırmada skor gönderilmez — tik için tüm testleri koştur.
Takılırsan "Çözümü Göster" (3 gün sonra açılır). Test çıktısındaki "beklenen/gelen" en iyi ipucundur.