feat(rbac): zaštita mutirajućih ruta na ruteru (RequireDozvolaMut)

Mutirajuće rute (POST + brisanja preko GET-a) više se ne oslanjaju samo na
ručnu proveru u handleru. Uvedena middleware RequireDozvolaMut koja na odbijanje
vraća 403 (za razliku od RequireDozvola koja redirektuje, a ostaje za GET
preglede). U main.go svaka mutacija je obmotana helperom doz("modul.akcija"),
pa je ruter sada garantovani sloj zaštite — zaboravljena provera u handleru ne
ostavlja endpoint nezaštićenim.

Mapiranje rute->dozvola izvučeno iz postojećih provera u handlerima. Ručne
provere (zahtevajDozvolu) zadržane kao odbrana u dubinu. Namerni izuzeci:
javne rute, /podsetnici/* (bez dozvole po dizajnu), /admin/* (RequireAdmin po
ulozi) i lične profil-akcije.
This commit is contained in:
2026-06-12 19:34:16 +02:00
parent a632c1bad8
commit 4c461522d3
2 changed files with 57 additions and 32 deletions
+18
View File
@@ -128,6 +128,24 @@ func RequireDozvola(proveri func(ctx context.Context, uloga, akcija string) bool
}
}
// RequireDozvolaMut je kao RequireDozvola, ali namenjen mutirajućim rutama
// (POST i akcije brisanja). Na odbijanje vraća 403 sa srpskom porukom umesto
// redirecta — isto kao handler.zahtevajDozvolu, pa ne kvari AJAX/fetch pozive.
// Postavljanjem ove provere na ruteru, zaštita mutacije više ne zavisi od toga
// da li je programer dodao proveru u samom handleru.
func RequireDozvolaMut(proveri func(ctx context.Context, uloga, akcija string) bool, akcija string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
k := KorisnikIzKonteksta(r.Context())
if k == nil || !proveri(r.Context(), k.Uloga, akcija) {
http.Error(w, "Nemate dozvolu za ovu akciju.", http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
}
}
// postaviFlashGresku upisuje jednokratnu poruku o grešci u kolačić
func postaviFlashGresku(w http.ResponseWriter, poruka string) {
http.SetCookie(w, &http.Cookie{