AccessControl: Add accesscontrol metadata to datasources DTOs (#42675)
* AccessControl: Provide scope to frontend * Covering datasources with accesscontrol metadata * Write benchmark tests for GetResourcesMetadata * Add accesscontrol util and interface * Add the hasPermissionInMetadata function in the frontend access control code * Use IsDisabled rather that performing a feature toggle check Co-authored-by: Karl Persson <kalle.persson@grafana.com>
This commit is contained in:
co-authored by
Karl Persson
parent
2b1ed43cb2
commit
c7cabdfd6f
@@ -101,7 +101,7 @@ func (s *AccessControlStore) setResourcePermissions(
|
||||
`
|
||||
|
||||
var current []accesscontrol.Permission
|
||||
if err := sess.SQL(rawSQL, role.ID, getResourceScope(cmd.Resource, cmd.ResourceID)).Find(¤t); err != nil {
|
||||
if err := sess.SQL(rawSQL, role.ID, accesscontrol.GetResourceScope(cmd.Resource, cmd.ResourceID)).Find(¤t); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ func (s *AccessControlStore) RemoveResourcePermission(ctx context.Context, orgID
|
||||
args := []interface{}{
|
||||
orgID,
|
||||
cmd.PermissionID,
|
||||
getResourceScope(cmd.Resource, cmd.ResourceID),
|
||||
accesscontrol.GetResourceScope(cmd.Resource, cmd.ResourceID),
|
||||
}
|
||||
|
||||
for _, a := range cmd.Actions {
|
||||
@@ -307,12 +307,12 @@ func getResourcesPermissions(sess *sqlstore.DBSession, orgID int64, query access
|
||||
|
||||
args := []interface{}{
|
||||
orgID,
|
||||
getResourceAllScope(query.Resource),
|
||||
getResourceAllIDScope(query.Resource),
|
||||
accesscontrol.GetResourceAllScope(query.Resource),
|
||||
accesscontrol.GetResourceAllIDScope(query.Resource),
|
||||
}
|
||||
|
||||
for _, id := range query.ResourceIDs {
|
||||
args = append(args, getResourceScope(query.Resource, id))
|
||||
args = append(args, accesscontrol.GetResourceScope(query.Resource, id))
|
||||
}
|
||||
|
||||
for _, a := range query.Actions {
|
||||
@@ -333,14 +333,14 @@ func getResourcesPermissions(sess *sqlstore.DBSession, orgID int64, query access
|
||||
return nil, err
|
||||
}
|
||||
|
||||
scopeAll := getResourceAllScope(query.Resource)
|
||||
scopeAllIDs := getResourceAllIDScope(query.Resource)
|
||||
scopeAll := accesscontrol.GetResourceAllScope(query.Resource)
|
||||
scopeAllIDs := accesscontrol.GetResourceAllIDScope(query.Resource)
|
||||
out := make([]accesscontrol.ResourcePermission, 0, len(result))
|
||||
|
||||
// Add resourceIds and generate permissions for `*`, `resource:*` and `resource:id:*`
|
||||
// TODO: handle scope with other key prefixes e.g. `resource:name:*` and `resource:name:name`
|
||||
for _, id := range query.ResourceIDs {
|
||||
scope := getResourceScope(query.Resource, id)
|
||||
scope := accesscontrol.GetResourceScope(query.Resource, id)
|
||||
for _, p := range result {
|
||||
if p.Scope == scope || p.Scope == scopeAll || p.Scope == scopeAllIDs || p.Scope == "*" {
|
||||
p.ResourceID = id
|
||||
@@ -490,7 +490,7 @@ func getManagedPermissions(sess *sqlstore.DBSession, resourceID string, ids []in
|
||||
func managedPermission(action, resource string, resourceID string) accesscontrol.Permission {
|
||||
return accesscontrol.Permission{
|
||||
Action: action,
|
||||
Scope: getResourceScope(resource, resourceID),
|
||||
Scope: accesscontrol.GetResourceScope(resource, resourceID),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -505,15 +505,3 @@ func managedTeamRoleName(teamID int64) string {
|
||||
func managedBuiltInRoleName(builtinRole string) string {
|
||||
return fmt.Sprintf("managed:builtins:%s:permissions", strings.ToLower(builtinRole))
|
||||
}
|
||||
|
||||
func getResourceScope(resource string, resourceID string) string {
|
||||
return fmt.Sprintf("%s:id:%s", resource, resourceID)
|
||||
}
|
||||
|
||||
func getResourceAllScope(resource string) string {
|
||||
return fmt.Sprintf("%s:*", resource)
|
||||
}
|
||||
|
||||
func getResourceAllIDScope(resource string) string {
|
||||
return fmt.Sprintf("%s:id:*", resource)
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ func TestAccessControlStore_SetUserResourcePermissions(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, added, len(test.actions))
|
||||
for _, p := range added {
|
||||
assert.Equal(t, getResourceScope(test.resource, test.resourceID), p.Scope)
|
||||
assert.Equal(t, accesscontrol.GetResourceScope(test.resource, test.resourceID), p.Scope)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -158,7 +158,7 @@ func TestAccessControlStore_SetTeamResourcePermissions(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, added, len(test.actions))
|
||||
for _, p := range added {
|
||||
assert.Equal(t, getResourceScope(test.resource, test.resourceID), p.Scope)
|
||||
assert.Equal(t, accesscontrol.GetResourceScope(test.resource, test.resourceID), p.Scope)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -234,7 +234,7 @@ func TestAccessControlStore_SetBuiltinResourcePermissions(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, added, len(test.actions))
|
||||
for _, p := range added {
|
||||
assert.Equal(t, getResourceScope(test.resource, test.resourceID), p.Scope)
|
||||
assert.Equal(t, accesscontrol.GetResourceScope(test.resource, test.resourceID), p.Scope)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user