Files
Dasko 85a2ee1b64 Bezbednost: superadmin može da odblokira IP adrese zaključane bruteforce zaštitom
Nova stranica /admin/blokirane-ip — lista IP adresa sa previše neuspelih pokušaja
prijave (broj neuspeha, poslednji pokušaj, preostalo vreme zaključavanja) i dugme
za ručno odblokiranje. Nova dozvola 'bezbednost.odblokiraj', namerno rezervisana
isključivo za ulogu superadmin (admin je nema — odblokiranje zaobilazi bruteforce
zaštitu). Repo metode PokusajiPrijaveRepo.ListaBlokiranih/Odblokiraj.
2026-07-02 21:24:25 +02:00

158 lines
4.1 KiB
Go

package middleware
// sve poznate akcije u sistemu
// Napomena: pregled magacina i podsetnici su namerno javni (bez dozvole) i nisu ovde.
// Upravljanje korisnicima ide preko uloge (RequireAdmin middleware), ne preko dozvole.
var sveAkcije = []string{
"artikal.dodaj",
"artikal.izmeni",
"artikal.obrisi",
"artikal.premesti",
"kategorija.pregled",
"kategorija.dodaj",
"kategorija.izmeni",
"kategorija.obrisi",
"nabavka.pregled",
"nabavka.dodaj",
"nabavka.obrisi",
"nabavka.storno",
"dobavljac.pregled",
"dobavljac.dodaj",
"dobavljac.izmeni",
"dobavljac.obrisi",
"servis.pregled",
"servis.dodaj",
"servis.izmeni",
"servis.obrisi",
"servis.storno",
"prodaja.pregled",
"prodaja.dodaj",
"prodaja.storno",
"klijent.pregled",
"klijent.dodaj",
"klijent.izmeni",
"klijent.obrisi",
"izvestaj.pregled",
"podesavanja.pregled",
"podesavanja.izmeni",
"podesavanja.login_pozadina",
"backup.pregled",
"backup.pokreni",
"tema.lokalno",
"dashboard.prihod",
"pdv.pregled",
"pdv.dodaj",
"pdv.obrisi",
"kpo.pregled",
"kpo.dodaj",
"kpo.obrisi",
"fiskal.pazar",
"fiskal.zakljucenje",
"bezbednost.odblokiraj",
}
// SveAkcije vraća listu svih poznatih akcija — koristi se pri inicijalizaciji baze i resetu
func SveAkcije() []string {
return sveAkcije
}
// ImaDozvolu proverava da li data uloga sme da izvrši traženu akciju
func ImaDozvolu(uloga, akcija string) bool {
switch uloga {
case "superadmin":
// superadmin sme sve
return true
case "admin":
switch akcija {
// artikal (pregled magacina je javan — nije dozvola)
case "artikal.dodaj", "artikal.izmeni",
"artikal.obrisi", "artikal.premesti":
return true
// kategorija
case "kategorija.pregled", "kategorija.dodaj", "kategorija.izmeni", "kategorija.obrisi":
return true
// nabavka
case "nabavka.pregled", "nabavka.dodaj", "nabavka.obrisi", "nabavka.storno":
return true
// dobavljač
case "dobavljac.pregled", "dobavljac.dodaj",
"dobavljac.izmeni", "dobavljac.obrisi":
return true
// servis
case "servis.pregled", "servis.dodaj",
"servis.izmeni", "servis.obrisi", "servis.storno":
return true
// prodaja
case "prodaja.pregled", "prodaja.dodaj", "prodaja.storno":
return true
// klijent
case "klijent.pregled", "klijent.dodaj",
"klijent.izmeni", "klijent.obrisi":
return true
// izveštaji i podešavanja
case "izvestaj.pregled",
"podesavanja.pregled", "podesavanja.izmeni":
return true
// backup
case "backup.pregled", "backup.pokreni":
return true
// pozadina prijavne stranice
case "podesavanja.login_pozadina":
return true
// lokalna tema
case "tema.lokalno":
return true
// dashboard — prihod samo admin+
case "dashboard.prihod":
return true
// PDV evidencija (KIR/KPR) — administrativno, radnik nema
case "pdv.pregled", "pdv.dodaj", "pdv.obrisi":
return true
// KPO (knjiga o ostvarenom prometu) — administrativno, radnik nema
case "kpo.pregled", "kpo.dodaj", "kpo.obrisi":
return true
// dnevni fiskalni pazar — administrativno, radnik nema (zaključenje dana je nepovratno)
case "fiskal.pazar", "fiskal.zakljucenje":
return true
// "bezbednost.odblokiraj" NAMERNO izostavljeno iz admin uloge — odblokiranje IP
// adrese zaobilazi bruteforce zaštitu, pa je rezervisano isključivo za superadmin.
}
return false
case "radnik":
switch akcija {
// kategorija — samo pregled
case "kategorija.pregled":
return true
// dobavljač — bez brisanja
case "dobavljac.pregled", "dobavljac.dodaj", "dobavljac.izmeni":
return true
// servis — bez brisanja
case "servis.pregled", "servis.dodaj", "servis.izmeni":
return true
// prodaja — bez brisanja i storna
case "prodaja.pregled", "prodaja.dodaj":
return true
// klijent — bez brisanja
case "klijent.pregled", "klijent.dodaj", "klijent.izmeni":
return true
// lokalna tema
case "tema.lokalno":
return true
}
return false
}
return false
}
// SveDozvole vraća mapu svih akcija sa vrednošću true/false za datu ulogu
func SveDozvole(uloga string) map[string]bool {
m := make(map[string]bool, len(sveAkcije))
for _, akcija := range sveAkcije {
m[akcija] = ImaDozvolu(uloga, akcija)
}
return m
}