Skip to content

Code2Work/fullstack-backend-project-13

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Not Sistemi API (Spring Security + Test)

Amaç

Bir okul not sistemi REST API'si yazacaksın. Öğretmen (TEACHER) not girebilir; öğrenci (STUDENT) salt-okunurdur — notları görebilir ama ekleyemez. Şifreler BCrypt ile hash'lenir, erişim rol bazlı korunur. Süre: ~5-7 saat.

Bu hafta odak: Spring Security (session-based), rol bazlı yetki (yazma = TEACHER, okuma = giriş yapan herkes), şifre hash'leme ve birim testi (Mockito + MockMvc).

Mimari (hazır verilenler)

Controller ──> Service ──> Repository (JpaRepository) ──> H2
     ▲
SecurityFilterChain  (POST /grades = TEACHER, GET /grades = giriş yapan herkes)
CustomUserDetailsService  (kullanıcıyı DB'den yükler)
BCryptPasswordEncoder

HAZIR — dokunma

  • entity/User (username, hash'li password, role), Grade (studentUsername, course, score), Role enum (TEACHER, STUDENT)
  • repository/UserRepository, GradeRepository (findByStudentUsername türetilmiş sorgu dahil)
  • dto/RegisterRequest, GradeRequest (@Valid: not 0-100), UserResponse (kayıt yanıtı — şifre taşımaz)
  • security/SecurityConfig (SecurityFilterChain + BCryptPasswordEncoder), CustomUserDetailsService
  • controller/GlobalExceptionHandler, application.properties

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

  1. AuthService.register (TODO 1-3): kullanıcı adı çakışırsa IllegalArgumentException; şifreyi hash'le; kaydet.
  2. GradeService (TODO 4-6): add (kaydet), findAll (hepsi), findByStudent (tek öğrenci).
  3. AuthController (TODO 7-9): POST /register201, yanıtta şifreyi döndürme (UserResponse DTO kullan).
  4. GradeController (TODO 10-12): POST /grades (201), GET /grades (hepsi), GET /grades/student/{username}path variable ile bir öğrencinin notları.

💡 Yetki kuralları SecurityConfig'de hazır: POST /grades sadece TEACHER, GET uçları giriş yapan herkese açık. Controller'da ekstra rol kontrolü yazma — Spring Security isteği daha controller'a gelmeden 401/403 ile reddeder.

Çalıştırma & Deneme

mvn spring-boot:run
# Kullanıcı oluştur:
curl -i -X POST localhost:8080/register -H "Content-Type: application/json" \
  -d '{"username":"hoca","password":"sifre123","role":"TEACHER"}'
curl -i -X POST localhost:8080/register -H "Content-Type: application/json" \
  -d '{"username":"ali","password":"sifre123","role":"STUDENT"}'
# Öğretmen not girer (201); öğrenci girmeye çalışırsa 403:
curl -i -u hoca:sifre123 -X POST localhost:8080/grades -H "Content-Type: application/json" \
  -d '{"studentUsername":"ali","course":"Matematik","score":90}'
# Giriş yapan herkes notları okuyabilir:
curl -i -u ali:sifre123 localhost:8080/grades
curl -i -u ali:sifre123 localhost:8080/grades/student/ali
# Kimliksiz erişim → 401:
curl -i localhost:8080/grades

Öğrenme Hedefleri

  • Spring Security: SecurityFilterChain, httpBasic, rol bazlı authorizeHttpRequests (yazma=rol, okuma=authenticated)
  • Şifre güvenliği: PasswordEncoder (BCrypt); yanıtta hassas alanı gizleme (UserResponse DTO)
  • REST: path variable (/student/{username}) + türetilmiş sorgu (findByStudentUsername)
  • Birim testi: Mockito (servis) + MockMvc (@WithMockUser, 401/403/201, rol)

Testler ve Skor

15 test: AuthServiceTest + GradeServiceTest (Mockito), SecurityTest (MockMvc — rol, 401/403/201, path variable sorgu). 1. student_id.txt'ye Kaizu numaranı yaz. 2. mvn test. 3. 15/15 → panelde yeşil tik.

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). Test çıktısındaki "beklenen/gelen" en iyi ipucudur.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages