Code-review popravke: RequireDozvola middleware, validacija backupa, dedup partiala

Bezbednost / dozvole:
  - Nov RequireDozvola(proveri, akcija) middleware (po uzoru na RequireAdmin):
    na odbijanje redirekt na /dashboard sa flash porukom umesto golog 403
  - 10 "pregled" ruta (prodaja, servis, klijenti, dobavljači, nabavke) prešlo
    na deklarativnu proveru na nivou rute
  - Uklonjene inline pregled-provere iz handlera — provera je sad na jednom
    mestu po ruti, vidljiva u ruteru

  Backup podešavanja:
  - Neispravan unos (van opsega ili ne-broj) više se ne preskače tiho;
    prikazuje se jasna greška i ne prikazuje se lažno "sačuvano"
  - Hvata se greška pri čuvanju u bazu (uklonjen progutani _ =)

  Šabloni:
  - "Premesti" dropdown izvučen u jedan {{define "premestiMeni"}} partial
    (više nije dupliran u tabeli i mobilnoj kartici)
  - Dodat dict helper u FuncMap saSidebar šablona radi prosleđivanja više
    vrednosti partialu; standalone šabloni namerno ostaju bez izmene
This commit is contained in:
2026-06-09 01:26:10 +02:00
parent 53432c8c41
commit cf13d0fe15
10 changed files with 93 additions and 95 deletions
+18
View File
@@ -109,6 +109,24 @@ func RequireAdmin(next http.Handler) http.Handler {
})
}
// RequireDozvola je middleware koji propušta korisnika samo ako njegova uloga
// ima traženu akciju. Provera je DB-backed (prosleđuje se DozvoleRepo.ImaDozvolu),
// tako da poštuje izmene matrice dozvola. Koristi se na nivou rute za "pregled"
// stranica, umesto ponavljanja iste provere u svakom handleru.
func RequireDozvola(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) {
postaviFlashGresku(w, "Nemate dozvolu za ovu stranicu.")
http.Redirect(w, r, "/dashboard", http.StatusSeeOther)
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{