Auth: Add empty role definition (#64694)
* Allow setting role as None Co-authored-by: gamab <gabi.mabs@gmail.com> Seeking for places where role.None would be used Co-authored-by: Jguer <joao.guerreiro@grafana.com> Adding None role to the frontend Co-authored-by: Jguer <joao.guerreiro@grafana.com> unify org role declaration and remove from add permission fix backend test fix backend lint * remove role none from frontend * Simplify checks Co-authored-by: Kalle Persson <kalle.persson@grafana.com> * nits --------- Co-authored-by: Kalle Persson <kalle.persson@grafana.com>
This commit is contained in:
co-authored by
gamab
Kalle Persson
parent
b6fbf307d9
commit
d6c468c1c2
@@ -8,6 +8,7 @@ import (
|
||||
var (
|
||||
ErrFixedRolePrefixMissing = errors.New("fixed role should be prefixed with '" + FixedRolePrefix + "'")
|
||||
ErrInvalidBuiltinRole = errors.New("built-in role is not valid")
|
||||
ErrNoneRoleAssignment = errors.New("none role cannot receive permissions")
|
||||
ErrInvalidScope = errors.New("invalid scope")
|
||||
ErrResolverNotFound = errors.New("no resolver found")
|
||||
ErrPluginIDRequired = errors.New("plugin ID is required")
|
||||
|
||||
@@ -264,6 +264,9 @@ func ValidateFixedRole(role RoleDTO) error {
|
||||
// ValidateBuiltInRoles errors when a built-in role does not match expected pattern
|
||||
func ValidateBuiltInRoles(builtInRoles []string) error {
|
||||
for _, br := range builtInRoles {
|
||||
if org.RoleType(br) == org.RoleNone {
|
||||
return ErrNoneRoleAssignment
|
||||
}
|
||||
if !org.RoleType(br).IsValid() && br != RoleGrafanaAdmin {
|
||||
return fmt.Errorf("'%s' %w", br, ErrInvalidBuiltinRole)
|
||||
}
|
||||
@@ -327,6 +330,17 @@ func BuildBasicRoleDefinitions() map[string]*RoleDTO {
|
||||
Permissions: []Permission{},
|
||||
Hidden: true,
|
||||
},
|
||||
string(org.RoleNone): {
|
||||
Name: BasicRolePrefix + "none",
|
||||
UID: BasicRoleUIDPrefix + "none",
|
||||
OrgID: GlobalOrgID,
|
||||
Version: 1,
|
||||
DisplayName: string(org.RoleNone),
|
||||
Description: "None role",
|
||||
Group: "Basic",
|
||||
Permissions: []Permission{},
|
||||
Hidden: true,
|
||||
},
|
||||
RoleGrafanaAdmin: {
|
||||
Name: BasicRolePrefix + "grafana_admin",
|
||||
UID: BasicRoleUIDPrefix + "grafana_admin",
|
||||
|
||||
@@ -47,9 +47,10 @@ type OrgUser struct {
|
||||
type RoleType = roletype.RoleType
|
||||
|
||||
const (
|
||||
RoleViewer RoleType = "Viewer"
|
||||
RoleEditor RoleType = "Editor"
|
||||
RoleAdmin RoleType = "Admin"
|
||||
RoleNone RoleType = roletype.RoleNone
|
||||
RoleViewer RoleType = roletype.RoleViewer
|
||||
RoleEditor RoleType = roletype.RoleEditor
|
||||
RoleAdmin RoleType = roletype.RoleAdmin
|
||||
)
|
||||
|
||||
type CreateOrgCommand struct {
|
||||
|
||||
@@ -77,6 +77,40 @@ func TestStore_CreateServiceAccount(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestStore_CreateServiceAccountRoleNone(t *testing.T) {
|
||||
_, store := setupTestDatabase(t)
|
||||
orgQuery := &org.CreateOrgCommand{Name: orgimpl.MainOrgName}
|
||||
orgResult, err := store.orgService.CreateWithMember(context.Background(), orgQuery)
|
||||
require.NoError(t, err)
|
||||
|
||||
serviceAccountName := "new Service Account"
|
||||
serviceAccountOrgId := orgResult.ID
|
||||
serviceAccountRole := org.RoleNone
|
||||
saForm := serviceaccounts.CreateServiceAccountForm{
|
||||
Name: serviceAccountName,
|
||||
Role: &serviceAccountRole,
|
||||
IsDisabled: nil,
|
||||
}
|
||||
|
||||
saDTO, err := store.CreateServiceAccount(context.Background(), serviceAccountOrgId, &saForm)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "sa-new-service-account", saDTO.Login)
|
||||
assert.Equal(t, serviceAccountName, saDTO.Name)
|
||||
assert.Equal(t, 0, int(saDTO.Tokens))
|
||||
|
||||
retrieved, err := store.RetrieveServiceAccount(context.Background(), serviceAccountOrgId, saDTO.Id)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "sa-new-service-account", retrieved.Login)
|
||||
assert.Equal(t, serviceAccountName, retrieved.Name)
|
||||
assert.Equal(t, serviceAccountOrgId, retrieved.OrgId)
|
||||
assert.Equal(t, string(serviceAccountRole), retrieved.Role)
|
||||
|
||||
retrievedId, err := store.RetrieveServiceAccountIdByName(context.Background(), serviceAccountOrgId, serviceAccountName)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, saDTO.Id, retrievedId)
|
||||
assert.Equal(t, saDTO.Role, string(org.RoleNone))
|
||||
}
|
||||
|
||||
func TestStore_DeleteServiceAccount(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
|
||||
@@ -17,13 +17,14 @@ import (
|
||||
type roleType string
|
||||
|
||||
const (
|
||||
RoleNone roleType = "None"
|
||||
RoleViewer roleType = "Viewer"
|
||||
RoleEditor roleType = "Editor"
|
||||
RoleAdmin roleType = "Admin"
|
||||
)
|
||||
|
||||
func (r roleType) IsValid() bool {
|
||||
return r == RoleViewer || r == RoleAdmin || r == RoleEditor
|
||||
return r == RoleViewer || r == RoleAdmin || r == RoleEditor || r == RoleNone
|
||||
}
|
||||
|
||||
type permissionType int
|
||||
|
||||
Reference in New Issue
Block a user