Skip to content

Code2Work/fullstack-backend-project-12

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Kütüphane API — Güvenlik (Spring Security + Test)

Amaç

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). JpaRepository ve DTO artık serbest.

Mimari (hazır verilenler)

Controller ──> Service ──> Repository (JpaRepository) ──> H2
     ▲
SecurityFilterChain  (kimlik + yetki: /books POST = LIBRARIAN)
CustomUserDetailsService  (kullanıcıyı DB'den yükler)
BCryptPasswordEncoder  (şifre hash)

HAZIR — dokunma

  • entity/User (username, hash'li password, role), Book (isbn, title), Role enum (USER, LIBRARIAN)
  • repository/UserRepository, BookRepository (JpaRepository)
  • dto/RegisterRequest, BookRequest (@Valid doğrulama hazır)
  • security/SecurityConfigSecurityFilterChain + BCryptPasswordEncoder bean'i
  • security/CustomUserDetailsService — DB'den kullanıcı yükleme (rol → ROLE_* yetkisi)
  • controller/GlobalExceptionHandler — hataları 400'e çevirir
  • application.properties

SEN YAZACAKSIN — service/ ve controller/ altındaki // TODO N:

  1. AuthService.register (TODO 1-3): kullanıcı adı çakışıyorsa IllegalArgumentException; şifreyi passwordEncoder.encode(...) ile hash'le (asla düz metin!); User oluşturup kaydet.
  2. BookService (TODO 4-5): create (kaydet+döndür), findAll.
  3. AuthController (TODO 6-8): POST /register201; yanıtta şifreyi DÖNDÜRME (sadece id/username/role).
  4. BookController (TODO 9-10): GET /books (liste), POST /books201.

💡 Yetki kuralı zaten SecurityConfig'de: POST /bookshasRole("LIBRARIAN"). Controller'da ekstra kontrol yazmana gerek yok — Spring Security isteği daha controller'a gelmeden 401/403 ile reddeder.

Çalıştırma & Deneme

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"}'

Öğrenme Hedefleri

  • Spring Security: SecurityFilterChain, httpBasic, rol bazlı authorizeHttpRequests
  • Şifre güvenliği: PasswordEncoder (BCrypt) ile hash; düz metin saklamama
  • UserDetailsService ile DB tabanlı kimlik doğrulama (verilen kodu oku, anla)
  • Birim testi: Mockito (@Mock/@InjectMocks, servis mantığı) + MockMvc (@WithMockUser, rol bazlı erişim)

Testler ve Skor

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.

Çözüm

Takılırsan "Çözümü Göster" (3 gün sonra açılır). Test çıktısındaki "beklenen/gelen" en iyi ipucundur.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages