mirror of https://github.com/grafana/grafana
RBAC: Remove dashboard guardians pt 2 (#102556)
* remove NewByDashboard guardian * remove unused authorizer * more cleanup * simplify canAdmin evaluationpull/102590/head
parent
f2770b0984
commit
e2737f195b
@ -1,91 +0,0 @@ |
||||
package dashboard |
||||
|
||||
import ( |
||||
"context" |
||||
|
||||
"k8s.io/apiserver/pkg/authorization/authorizer" |
||||
|
||||
claims "github.com/grafana/authlib/types" |
||||
"github.com/grafana/grafana/pkg/apimachinery/identity" |
||||
"github.com/grafana/grafana/pkg/infra/log" |
||||
"github.com/grafana/grafana/pkg/services/dashboards" |
||||
"github.com/grafana/grafana/pkg/services/guardian" |
||||
) |
||||
|
||||
func GetAuthorizer(dashboardService dashboards.DashboardService, l log.Logger) authorizer.Authorizer { |
||||
return authorizer.AuthorizerFunc( |
||||
func(ctx context.Context, attr authorizer.Attributes) (authorized authorizer.Decision, reason string, err error) { |
||||
// Use the standard authorizer
|
||||
if !attr.IsResourceRequest() { |
||||
return authorizer.DecisionNoOpinion, "", nil |
||||
} |
||||
|
||||
user, err := identity.GetRequester(ctx) |
||||
if err != nil { |
||||
return authorizer.DecisionDeny, "", err |
||||
} |
||||
|
||||
// Allow search and list requests
|
||||
if attr.GetResource() == "search" || attr.GetName() == "" { |
||||
return authorizer.DecisionNoOpinion, "", nil |
||||
} |
||||
|
||||
ns := attr.GetNamespace() |
||||
if ns == "" { |
||||
return authorizer.DecisionDeny, "expected namespace", nil |
||||
} |
||||
|
||||
info, err := claims.ParseNamespace(attr.GetNamespace()) |
||||
if err != nil { |
||||
return authorizer.DecisionDeny, "error reading org from namespace", err |
||||
} |
||||
|
||||
// expensive path to lookup permissions for a single dashboard
|
||||
dto, err := dashboardService.GetDashboard(ctx, &dashboards.GetDashboardQuery{ |
||||
UID: attr.GetName(), |
||||
OrgID: info.OrgID, |
||||
}) |
||||
if err != nil { |
||||
return authorizer.DecisionDeny, "error loading dashboard", err |
||||
} |
||||
|
||||
ok := false |
||||
guardian, err := guardian.NewByDashboard(ctx, dto, info.OrgID, user) |
||||
if err != nil { |
||||
return authorizer.DecisionDeny, "", err |
||||
} |
||||
|
||||
switch attr.GetVerb() { |
||||
case "get": |
||||
ok, err = guardian.CanView() |
||||
if !ok || err != nil { |
||||
return authorizer.DecisionDeny, "can not view dashboard", err |
||||
} |
||||
case "create": |
||||
fallthrough |
||||
case "post": |
||||
ok, err = guardian.CanSave() // vs Edit?
|
||||
if !ok || err != nil { |
||||
return authorizer.DecisionDeny, "can not save dashboard", err |
||||
} |
||||
case "update": |
||||
fallthrough |
||||
case "patch": |
||||
fallthrough |
||||
case "put": |
||||
ok, err = guardian.CanEdit() // vs Save
|
||||
if !ok || err != nil { |
||||
return authorizer.DecisionDeny, "can not edit dashboard", err |
||||
} |
||||
case "delete": |
||||
ok, err = guardian.CanDelete() |
||||
if !ok || err != nil { |
||||
return authorizer.DecisionDeny, "can not delete dashboard", err |
||||
} |
||||
default: |
||||
l.Info("unknown verb", "verb", attr.GetVerb()) |
||||
return authorizer.DecisionNoOpinion, "unsupported verb", nil // Unknown verb
|
||||
} |
||||
return authorizer.DecisionAllow, "", nil |
||||
}) |
||||
} |
Loading…
Reference in new issue