Skip to content

Commit

Permalink
fix: multi-level inheritance with different domains (#931)
Browse files Browse the repository at this point in the history
Signed-off-by: abingcbc <abingcbc626@gmail.com>
  • Loading branch information
Abingcbc committed Dec 13, 2021
1 parent f7e9ce9 commit f329687
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 24 deletions.
65 changes: 41 additions & 24 deletions rbac/default-role-manager/role_manager.go
Expand Up @@ -214,35 +214,52 @@ func (rm *RoleManager) HasLink(name1 string, name2 string, domains ...string) (b

matchedDomain := rm.getPatternDomain(domains[0])

for _, domainName := range matchedDomain {
roleQueue := []string{name1}
inherited := make(map[string]bool)

domainValue, _ := rm.allDomains.LoadOrStore(domainName, &Roles{})
domain := domainValue.(*Roles)

if rm.hasPattern {
flag := false
domain.Range(func(key, value interface{}) bool {
if rm.match(name1, key.(string)) && value.(*Role).hasRoleWithMatchingFunc(name2, rm.maxHierarchyLevel, rm.match) {
flag = true
return false
for len(roleQueue) != 0 {
role := roleQueue[0]
roleQueue = roleQueue[1:]
if _, ok := inherited[role]; ok {
continue
}
inherited[role] = true

for _, domainName := range matchedDomain {

domainValue, _ := rm.allDomains.LoadOrStore(domainName, &Roles{})
domain := domainValue.(*Roles)

if rm.hasPattern {
flag := false
domain.Range(func(key, value interface{}) bool {
if rm.match(role, key.(string)) && value.(*Role).hasRoleWithMatchingFunc(name2, rm.maxHierarchyLevel, rm.match) {
flag = true
return false
}
return true
})
if flag {
return true, nil
}
} else {
role1Value, ok := domain.Load(role)
if !ok {
continue
}
role1 := role1Value.(*Role)
result := role1.hasRole(name2, rm.maxHierarchyLevel)
if result {
return true, nil
} else {
for _, r := range role1.roles {
roleQueue = append(roleQueue, r.name)
}
}
return true
})
if flag {
return true, nil
}
} else {
role1Value, ok := domain.Load(name1)
if !ok {
continue
}
role1 := role1Value.(*Role)
result := role1.hasRole(name2, rm.maxHierarchyLevel)
if result {
return true, nil
}
}
}

return false, nil
default:
return false, errors.ERR_DOMAIN_PARAMETER
Expand Down
11 changes: 11 additions & 0 deletions rbac/default-role-manager/role_manager_test.go
Expand Up @@ -299,3 +299,14 @@ func TestMatchingFuncOrder(t *testing.T) {
testRole(t, rm, "u1", "g1", true)
testRole(t, rm, "u1", "g2", true)
}

func TestDomainMatchingFuncWithDifferentDomain(t *testing.T) {
rm := NewRoleManager(10)
rm.AddDomainMatchingFunc("keyMatch", util.KeyMatch)

_ = rm.AddLink("alice", "editor", "*")
_ = rm.AddLink("editor", "admin", "domain1")

testDomainRole(t, rm, "alice", "admin", "domain1", true)
testDomainRole(t, rm, "alice", "admin", "domain2", false)
}

0 comments on commit f329687

Please sign in to comment.