Bezbednost: ispravke kontrole pristupa u admin i handler sloju
This commit is contained in:
@@ -88,12 +88,37 @@ func RequireSuperAdmin(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
k := KorisnikIzKonteksta(r.Context())
|
||||
if k == nil || k.Uloga != "superadmin" {
|
||||
http.Error(w, "Pristup odbijen", http.StatusForbidden)
|
||||
postaviFlashGresku(w, "Nemate dozvolu za ovu stranicu.")
|
||||
http.Redirect(w, r, "/dashboard", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
// RequireAdmin je middleware koji propušta admin i superadmin korisnike
|
||||
func RequireAdmin(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
k := KorisnikIzKonteksta(r.Context())
|
||||
if k == nil || (k.Uloga != "admin" && k.Uloga != "superadmin") {
|
||||
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{
|
||||
Name: "ntech_flash_greska",
|
||||
Value: poruka,
|
||||
Path: "/",
|
||||
MaxAge: 60,
|
||||
HttpOnly: true,
|
||||
})
|
||||
}
|
||||
|
||||
// ErrNijePrijavljen se vraća kada korisnik nije u contextu
|
||||
var ErrNijePrijavljen = errors.New("korisnik nije prijavljen")
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
package middleware
|
||||
|
||||
// sve poznate akcije u sistemu
|
||||
var sveAkcije = []string{
|
||||
"artikal.pregled",
|
||||
"artikal.dodaj",
|
||||
"artikal.izmeni",
|
||||
"artikal.obrisi",
|
||||
"artikal.premesti",
|
||||
"kategorija.pregled",
|
||||
"kategorija.dodaj",
|
||||
"kategorija.izmeni",
|
||||
"kategorija.obrisi",
|
||||
"nabavka.pregled",
|
||||
"nabavka.dodaj",
|
||||
"nabavka.obrisi",
|
||||
"dobavljac.pregled",
|
||||
"dobavljac.dodaj",
|
||||
"dobavljac.izmeni",
|
||||
"dobavljac.obrisi",
|
||||
"servis.pregled",
|
||||
"servis.dodaj",
|
||||
"servis.izmeni",
|
||||
"servis.obrisi",
|
||||
"prodaja.pregled",
|
||||
"prodaja.dodaj",
|
||||
"prodaja.obrisi",
|
||||
"klijent.pregled",
|
||||
"klijent.dodaj",
|
||||
"klijent.izmeni",
|
||||
"klijent.obrisi",
|
||||
"podsetnik.pregled",
|
||||
"podsetnik.dodaj",
|
||||
"podsetnik.izmeni",
|
||||
"podsetnik.obrisi",
|
||||
"izvestaj.pregled",
|
||||
"podesavanja.pregled",
|
||||
"podesavanja.izmeni",
|
||||
"korisnik.pregled",
|
||||
"korisnik.dodaj",
|
||||
"korisnik.izmeni",
|
||||
"korisnik.obrisi",
|
||||
"korisnik.uloga",
|
||||
"backup.pregled",
|
||||
"backup.pokreni",
|
||||
}
|
||||
|
||||
// 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
|
||||
case "artikal.pregled", "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":
|
||||
return true
|
||||
// dobavljač
|
||||
case "dobavljac.pregled", "dobavljac.dodaj",
|
||||
"dobavljac.izmeni", "dobavljac.obrisi":
|
||||
return true
|
||||
// servis
|
||||
case "servis.pregled", "servis.dodaj",
|
||||
"servis.izmeni", "servis.obrisi":
|
||||
return true
|
||||
// prodaja
|
||||
case "prodaja.pregled", "prodaja.dodaj", "prodaja.obrisi":
|
||||
return true
|
||||
// klijent
|
||||
case "klijent.pregled", "klijent.dodaj",
|
||||
"klijent.izmeni", "klijent.obrisi":
|
||||
return true
|
||||
// podsetnik
|
||||
case "podsetnik.pregled", "podsetnik.dodaj",
|
||||
"podsetnik.izmeni", "podsetnik.obrisi":
|
||||
return true
|
||||
// izveštaji i podešavanja
|
||||
case "izvestaj.pregled",
|
||||
"podesavanja.pregled", "podesavanja.izmeni":
|
||||
return true
|
||||
// korisnici (bez promene uloge)
|
||||
case "korisnik.pregled", "korisnik.dodaj",
|
||||
"korisnik.izmeni", "korisnik.obrisi":
|
||||
return true
|
||||
// backup
|
||||
case "backup.pregled", "backup.pokreni":
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
||||
case "radnik":
|
||||
switch akcija {
|
||||
// artikal — bez brisanja i premeštanja
|
||||
case "artikal.pregled", "artikal.dodaj", "artikal.izmeni":
|
||||
return true
|
||||
// kategorija — samo pregled
|
||||
case "kategorija.pregled":
|
||||
return true
|
||||
// nabavka — bez brisanja
|
||||
case "nabavka.pregled", "nabavka.dodaj":
|
||||
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
|
||||
case "prodaja.pregled", "prodaja.dodaj":
|
||||
return true
|
||||
// klijent — bez brisanja
|
||||
case "klijent.pregled", "klijent.dodaj", "klijent.izmeni":
|
||||
return true
|
||||
// podsetnik — sve
|
||||
case "podsetnik.pregled", "podsetnik.dodaj",
|
||||
"podsetnik.izmeni", "podsetnik.obrisi":
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user