1
This commit is contained in:
parent
be7c1c1278
commit
fb8113d989
@ -33,79 +33,17 @@ type PermissionTable struct {
|
||||
apiHash *q5.ConcurrentMap[string, bool]
|
||||
uiHash *q5.ConcurrentMap[string, bool]
|
||||
roleHash *q5.ConcurrentMap[string, *role]
|
||||
userHash *q5.ConcurrentMap[string, *Permission]
|
||||
userHash *q5.ConcurrentMap[string, *user]
|
||||
}
|
||||
|
||||
func (this *PermissionTable) Load() {
|
||||
this.apiHash = new(q5.ConcurrentMap[string, bool])
|
||||
this.uiHash = new(q5.ConcurrentMap[string, bool])
|
||||
this.roleHash = new(q5.ConcurrentMap[string, *role])
|
||||
this.userHash = new(q5.ConcurrentMap[string, *Permission])
|
||||
this.userHash = new(q5.ConcurrentMap[string, *user])
|
||||
this.loadPermission()
|
||||
this.loadRole()
|
||||
this.loadUser()
|
||||
{
|
||||
if jsonStr, err := f5.ReadJsonFile("../config/permission.json"); err == nil {
|
||||
type cfgPermission struct {
|
||||
API []string `json:"api"`
|
||||
UI []string `json:"ui"`
|
||||
}
|
||||
type AccountConfig struct {
|
||||
Roles []string `json:"roles"`
|
||||
Special cfgPermission `json:"special"`
|
||||
}
|
||||
permissioncfg := struct {
|
||||
Roles map[string]cfgPermission `json:"roles"`
|
||||
Accounts map[string]AccountConfig `json:"accounts"`
|
||||
}{}
|
||||
|
||||
if err := json.Unmarshal([]byte(jsonStr), &permissioncfg); err != nil {
|
||||
panic(fmt.Sprintf("load metafile json decode error %s %s", "permission.json", err))
|
||||
}
|
||||
|
||||
for account, cfg := range permissioncfg.Accounts {
|
||||
accpermission := new(Permission)
|
||||
accpermission.api = new(q5.ConcurrentMap[string, bool])
|
||||
accpermission.ui = new(q5.ConcurrentMap[string, bool])
|
||||
//load permission of the account's roles
|
||||
for _, role := range cfg.Roles {
|
||||
rp, exist := permissioncfg.Roles[role]
|
||||
if !exist {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, v := range rp.API {
|
||||
accpermission.api.Store(v, true)
|
||||
}
|
||||
|
||||
for _, v := range rp.UI {
|
||||
accpermission.ui.Store(v, true)
|
||||
}
|
||||
}
|
||||
|
||||
//load special permission
|
||||
for _, v := range cfg.Special.API {
|
||||
ret := strings.HasPrefix(v, "-")
|
||||
if ret {
|
||||
v = v[1:]
|
||||
}
|
||||
accpermission.api.Store(v, !ret)
|
||||
}
|
||||
|
||||
for _, v := range cfg.Special.UI {
|
||||
ret := strings.HasPrefix(v, "-")
|
||||
if ret {
|
||||
v = v[1:]
|
||||
}
|
||||
accpermission.ui.Store(v, !ret)
|
||||
}
|
||||
|
||||
this.userHash.Store(strings.ToLower(account), accpermission)
|
||||
}
|
||||
} else {
|
||||
panic(fmt.Sprintf("load metafile error %s %s", "permission.json", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (this *PermissionTable) CheckAPIPermission(account string, cmd string) bool {
|
||||
@ -161,18 +99,105 @@ func (this *PermissionTable) loadRole() {
|
||||
panic(fmt.Sprintf("load metafile error %s %s", "roles.json", err))
|
||||
}
|
||||
}
|
||||
for _, role := range roles {
|
||||
if jsonStr, err := f5.ReadJsonFile("../config/role/" + role + ".json"); err == nil {
|
||||
rolePermission := struct{
|
||||
Api []string `json:"api"`
|
||||
Ui []string `json:"ui"`
|
||||
}{}
|
||||
if err := q5.DecodeJson(jsonStr, &rolePermission); err != nil {
|
||||
panic(fmt.Sprintf("parse role metafile error %s %s", role + ".json", err))
|
||||
{
|
||||
for _, name := range roles {
|
||||
if jsonStr, err := f5.ReadJsonFile("../config/role/" + name + ".json"); err == nil {
|
||||
rolePermission := struct{
|
||||
Api []string `json:"api"`
|
||||
Ui []string `json:"ui"`
|
||||
}{}
|
||||
if err := q5.DecodeJson(jsonStr, &rolePermission); err != nil {
|
||||
panic(fmt.Sprintf("parse role metafile error %s %s", name + ".json", err))
|
||||
}
|
||||
p := this.newRole()
|
||||
for _, pName := range rolePermission.Api {
|
||||
p.api.Store(pName, true)
|
||||
}
|
||||
for _, pName := range rolePermission.Ui {
|
||||
p.api.Store(pName, true)
|
||||
}
|
||||
this.roleHash.Store(name, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (this *PermissionTable) loadUser() {
|
||||
users := []struct {
|
||||
AccountAddress string `json:"account_address"`
|
||||
Roles []string `json:"roles"`
|
||||
Special struct {
|
||||
Api []string `json:"api"`
|
||||
Ui []string `json:"ui"`
|
||||
} `json:"special"`
|
||||
}{}
|
||||
{
|
||||
if jsonStr, err := f5.ReadJsonFile("../config/users.json"); err == nil {
|
||||
if err := q5.DecodeJson(jsonStr, &users); err != nil {
|
||||
panic(fmt.Sprintf("parse metafile error %s %s", "usersa.json", err))
|
||||
}
|
||||
} else {
|
||||
panic(fmt.Sprintf("load metafile error %s %s", "users.json", err))
|
||||
}
|
||||
}
|
||||
{
|
||||
for _, u := range users {
|
||||
p := this.newUser()
|
||||
p.accountAddress = strings.ToLower(u.AccountAddress)
|
||||
for _, r := range u.Roles {
|
||||
if pr, ok := this.roleHash.Load(r); ok {
|
||||
p.roleHash.Store(r, *pr)
|
||||
} else {
|
||||
panic(fmt.Sprintf("load metafile error %s role:%s not exists", "users.json", r))
|
||||
}
|
||||
}
|
||||
for _, pName := range u.Special.Api {
|
||||
q5.AppendSlice(&p.specApi, pName)
|
||||
}
|
||||
for _, pName := range u.Special.Ui {
|
||||
q5.AppendSlice(&p.specApi, pName)
|
||||
}
|
||||
this.genUserPermission(p)
|
||||
this.userHash.Store(p.accountAddress, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (this *PermissionTable) newRole() *role {
|
||||
p := new(role)
|
||||
p.api = new(q5.ConcurrentMap[string, bool])
|
||||
p.ui = new(q5.ConcurrentMap[string, bool])
|
||||
return p
|
||||
}
|
||||
|
||||
func (this *PermissionTable) newUser() *user {
|
||||
p := new(user)
|
||||
p.roleHash = new(q5.ConcurrentMap[string, *role])
|
||||
p.api = new(q5.ConcurrentMap[string, bool])
|
||||
p.ui = new(q5.ConcurrentMap[string, bool])
|
||||
p.specApi = []string{}
|
||||
p.specUi = []string{}
|
||||
this.apiHash.Range(func (key string, val bool) bool {
|
||||
p.api.Store(key, false)
|
||||
return true
|
||||
})
|
||||
this.uiHash.Range(func (key string, val bool) bool {
|
||||
p.ui.Store(key, false)
|
||||
return true
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
func (this *PermissionTable) genUserPermission(u *user) {
|
||||
u.roleHash.Range(func(key string, val *role) bool {
|
||||
val.api.Range(func(key2 string, val2 bool) bool {
|
||||
u.api.Store(key2, true)
|
||||
return true
|
||||
})
|
||||
val.ui.Range(func(key2 string, val2 bool) bool {
|
||||
u.ui.Store(key2, true)
|
||||
return true
|
||||
})
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user