feat(go): add auditor role; (#3684)

This commit is contained in:
Vishal Dalwadi
2025-10-24 11:26:40 +05:30
committed by GitHub
parent 4aaa58e64f
commit c4313a4b77
4 changed files with 44 additions and 3 deletions

View File

@@ -2,10 +2,11 @@ package logic
import (
"errors"
"github.com/golang-jwt/jwt/v4"
"net/http"
"strings"
"github.com/golang-jwt/jwt/v4"
"github.com/gorilla/mux"
"github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/servercfg"
@@ -24,7 +25,6 @@ var GlobalPermissionsCheck = func(username string, r *http.Request) error { retu
// SecurityCheck - Check if user has appropriate permissions
func SecurityCheck(reqAdmin bool, next http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
r.Header.Set("ismaster", "no")
isGlobalAccesss := r.Header.Get("IS_GLOBAL_ACCESS") == "yes"

View File

@@ -102,6 +102,7 @@ const (
AdminRole UserRoleID = "admin"
ServiceUser UserRoleID = "service-user"
PlatformUser UserRoleID = "platform-user"
Auditor UserRoleID = "auditor"
NetworkAdmin UserRoleID = "network-admin"
NetworkUser UserRoleID = "network-user"
)

View File

@@ -44,6 +44,15 @@ func NetworkPermissionsCheck(username string, r *http.Request) error {
if userRole.FullAccess {
return nil
}
if userRole.ID == models.Auditor {
if r.Method == http.MethodGet {
return nil
} else {
return errors.New("access denied")
}
}
// get info from header to determine the target rsrc
targetRsrc := r.Header.Get("TARGET_RSRC")
targetRsrcID := r.Header.Get("TARGET_RSRC_ID")
@@ -160,6 +169,15 @@ func GlobalPermissionsCheck(username string, r *http.Request) error {
if userRole.FullAccess {
return nil
}
if userRole.ID == models.Auditor {
if r.Method == http.MethodGet {
return nil
} else {
return errors.New("access denied")
}
}
targetRsrc := r.Header.Get("TARGET_RSRC")
targetRsrcID := r.Header.Get("TARGET_RSRC_ID")
if targetRsrc == "" {

View File

@@ -43,6 +43,20 @@ var PlatformUserUserPermissionTemplate = models.UserRolePermissionTemplate{
},
}
var AuditorUserPermissionTemplate = models.UserRolePermissionTemplate{
ID: models.Auditor,
Default: true,
DenyDashboardAccess: false,
FullAccess: false,
NetworkLevelAccess: map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope{
models.NetworkRsrc: {
models.AllNetworkRsrcID: models.RsrcPermissionScope{
Read: true,
},
},
},
}
var NetworkAdminAllPermissionTemplate = models.UserRolePermissionTemplate{
ID: globalNetworksAdminRoleID,
Name: "Network Admins",
@@ -122,6 +136,8 @@ func UserRolesInit() {
database.Insert(ServiceUserPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
d, _ = json.Marshal(PlatformUserUserPermissionTemplate)
database.Insert(PlatformUserUserPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
d, _ = json.Marshal(AuditorUserPermissionTemplate)
database.Insert(AuditorUserPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
d, _ = json.Marshal(NetworkAdminAllPermissionTemplate)
database.Insert(NetworkAdminAllPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
d, _ = json.Marshal(NetworkUserAllPermissionTemplate)
@@ -992,6 +1008,13 @@ func FilterNetworksByRole(allnetworks []models.Network, user models.User) []mode
}
if !platformRole.FullAccess {
allNetworkRoles := make(map[models.NetworkID]struct{})
_, ok := platformRole.NetworkLevelAccess[models.NetworkRsrc]
if ok {
perm, ok := platformRole.NetworkLevelAccess[models.NetworkRsrc][models.AllNetworkRsrcID]
if ok && perm.Read {
return allnetworks
}
}
if len(user.NetworkRoles) > 0 {
for netID := range user.NetworkRoles {
if netID == models.AllNetworks {
@@ -1011,7 +1034,6 @@ func FilterNetworksByRole(allnetworks []models.Network, user models.User) []mode
return allnetworks
}
allNetworkRoles[netID] = struct{}{}
}
}
}