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).
Controller ──> Service ──> Repository (JpaRepository) ──> H2
▲
SecurityFilterChain (POST /grades = TEACHER, GET /grades = giriş yapan herkes)
CustomUserDetailsService (kullanıcıyı DB'den yükler)
BCryptPasswordEncoder
entity/—User(username, hash'li password, role),Grade(studentUsername, course, score),Roleenum (TEACHER,STUDENT)repository/—UserRepository,GradeRepository(findByStudentUsernametüretilmiş sorgu dahil)dto/—RegisterRequest,GradeRequest(@Valid: not 0-100),UserResponse(kayıt yanıtı — şifre taşımaz)security/—SecurityConfig(SecurityFilterChain+BCryptPasswordEncoder),CustomUserDetailsServicecontroller/GlobalExceptionHandler,application.properties
AuthService.register(TODO 1-3): kullanıcı adı çakışırsaIllegalArgumentException; şifreyi hash'le; kaydet.GradeService(TODO 4-6):add(kaydet),findAll(hepsi),findByStudent(tek öğrenci).AuthController(TODO 7-9):POST /register→201, yanıtta şifreyi döndürme (UserResponseDTO kullan).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 /gradessadeceTEACHER,GETuçları giriş yapan herkese açık. Controller'da ekstra rol kontrolü yazma — Spring Security isteği daha controller'a gelmeden 401/403 ile reddeder.
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- Spring Security:
SecurityFilterChain,httpBasic, rol bazlıauthorizeHttpRequests(yazma=rol, okuma=authenticated) - Şifre güvenliği:
PasswordEncoder(BCrypt); yanıtta hassas alanı gizleme (UserResponseDTO) - REST: path variable (
/student/{username}) + türetilmiş sorgu (findByStudentUsername) - Birim testi: Mockito (servis) + MockMvc (
@WithMockUser, 401/403/201, rol)
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.
Takılırsan "Çözümü Göster" (3 gün sonra). Test çıktısındaki "beklenen/gelen" en iyi ipucudur.