Skip to content

Commit 6fd1377

Browse files
author
Ryan Bak
committed
Add global_admin and read_editor roles to keystone
If a user has the global_admin roles in any keystone project they will be marked as a grafana admin.
1 parent 8e30d22 commit 6fd1377

File tree

5 files changed

+65
-15
lines changed

5 files changed

+65
-15
lines changed

conf/defaults.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,10 @@ config_file = /etc/grafana/ldap.toml
202202
enabled = false
203203
auth_url = http://localhost:5000
204204
default_domain = default
205+
global_admin_roles =
205206
admin_roles = admin
206207
editor_roles = _member_
208+
read_editor_roles =
207209
viewer_roles =
208210

209211
#################################### SMTP / Emailing ##########################

conf/sample.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,10 @@
195195
;auth_url = http://localhost:5000
196196
;v3 = false
197197
;default_domain = default
198+
;global_admin_roles =
198199
;admin_roles = admin
199200
;editor_roles = _member_
201+
;read_editor_roles =
200202
;viewer_roles =
201203

202204
#################################### SMTP / Emailing ##########################

pkg/login/auth.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@ func AuthenticateUser(query *LoginUserQuery) error {
4343
if setting.KeystoneEnabled {
4444
auther := NewKeystoneAuthenticator(setting.KeystoneURL,
4545
setting.KeystoneDefaultDomain,
46+
setting.KeystoneGlobalAdminRoles,
4647
setting.KeystoneAdminRoles,
4748
setting.KeystoneEditorRoles,
49+
setting.KeystoneReadEditorRoles,
4850
setting.KeystoneViewerRoles)
4951
err = auther.login(query)
5052
if err == nil || err != ErrInvalidCredentials {

pkg/login/keystone.go

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,24 @@ import (
99
)
1010

1111
type keystoneAuther struct {
12-
server string
13-
domainname string
14-
roles map[m.RoleType][]string
12+
server string
13+
domainname string
14+
roles map[m.RoleType][]string
15+
admin_roles []string
1516

1617
token string
1718
project_list map[string][]string
1819
}
1920

20-
func NewKeystoneAuthenticator(server, domainname string, admin_roles, editor_roles, viewer_roles []string) *keystoneAuther {
21+
func NewKeystoneAuthenticator(server, domainname string, global_admin_roles, admin_roles, editor_roles,
22+
read_editor_roles, viewer_roles []string) *keystoneAuther {
2123
roles := map[m.RoleType][]string{
22-
m.ROLE_ADMIN: admin_roles,
23-
m.ROLE_EDITOR: editor_roles,
24-
m.ROLE_VIEWER: viewer_roles,
24+
m.ROLE_ADMIN: admin_roles,
25+
m.ROLE_EDITOR: editor_roles,
26+
m.ROLE_READ_ONLY_EDITOR: read_editor_roles,
27+
m.ROLE_VIEWER: viewer_roles,
2528
}
26-
return &keystoneAuther{server: server, domainname: domainname, roles: roles}
29+
return &keystoneAuther{server: server, domainname: domainname, roles: roles, admin_roles: global_admin_roles}
2730
}
2831

2932
func (a *keystoneAuther) login(query *LoginUserQuery) error {
@@ -86,6 +89,19 @@ func (a *keystoneAuther) createGrafanaUser(username string) (*m.User, error) {
8689
return &cmd.Result, nil
8790
}
8891

92+
func (a *keystoneAuther) updateGrafanaUserPermissions(userid int64, isAdmin bool) error {
93+
cmd := m.UpdateUserPermissionsCommand{
94+
UserId: userid,
95+
IsGrafanaAdmin: isAdmin,
96+
}
97+
98+
if err := bus.Dispatch(&cmd); err != nil {
99+
return err
100+
}
101+
102+
return nil
103+
}
104+
89105
func (a *keystoneAuther) getGrafanaOrgFor(orgname string) (*m.Org, error) {
90106
// get org from grafana db
91107
orgQuery := m.GetOrgByNameQuery{Name: orgname}
@@ -204,6 +220,30 @@ func (a *keystoneAuther) syncOrgRoles(username, password string, user *m.User) e
204220
}
205221
}
206222

223+
// set or unset admin permissions
224+
isAdmin := false
225+
role_map := make(map[string]bool)
226+
for _, role := range a.admin_roles {
227+
role_map[role] = true
228+
}
229+
for project, _ := range a.project_list {
230+
if isAdmin == true {
231+
break
232+
}
233+
project_roles := a.project_list[project]
234+
for _, role := range project_roles {
235+
if _, ok := role_map[role]; ok {
236+
isAdmin = true
237+
break
238+
}
239+
}
240+
}
241+
if isAdmin != user.IsAdmin {
242+
if err := a.updateGrafanaUserPermissions(user.Id, isAdmin); err != nil {
243+
return err
244+
}
245+
}
246+
207247
orgsQuery = m.GetUserOrgListQuery{UserId: user.Id}
208248
if err := bus.Dispatch(&orgsQuery); err != nil {
209249
return err
@@ -268,7 +308,7 @@ func (a *keystoneAuther) getRole(user_roles []string) m.RoleType {
268308
for _, role := range user_roles {
269309
role_map[role] = true
270310
}
271-
role_order := []m.RoleType{m.ROLE_ADMIN, m.ROLE_EDITOR, m.ROLE_VIEWER}
311+
role_order := []m.RoleType{m.ROLE_ADMIN, m.ROLE_EDITOR, m.ROLE_READ_ONLY_EDITOR, m.ROLE_VIEWER}
272312
for _, role_type := range role_order {
273313
for _, role := range a.roles[role_type] {
274314
if _, ok := role_map[role]; ok {

pkg/setting/setting.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,14 @@ var (
127127
LdapConfigFile string
128128

129129
// Keystone
130-
KeystoneEnabled bool
131-
KeystoneURL string
132-
KeystoneDefaultDomain string
133-
KeystoneViewerRoles []string
134-
KeystoneEditorRoles []string
135-
KeystoneAdminRoles []string
130+
KeystoneEnabled bool
131+
KeystoneURL string
132+
KeystoneDefaultDomain string
133+
KeystoneViewerRoles []string
134+
KeystoneReadEditorRoles []string
135+
KeystoneEditorRoles []string
136+
KeystoneAdminRoles []string
137+
KeystoneGlobalAdminRoles []string
136138

137139
// SMTP email settings
138140
Smtp SmtpSettings
@@ -480,8 +482,10 @@ func NewConfigContext(args *CommandLineArgs) error {
480482
KeystoneURL = keystone.Key("auth_url").String()
481483
KeystoneDefaultDomain = keystone.Key("default_domain").String()
482484
KeystoneViewerRoles = strings.Split(keystone.Key("viewer_roles").String(), ",")
485+
KeystoneReadEditorRoles = strings.Split(keystone.Key("read_editor_roles").String(), ",")
483486
KeystoneEditorRoles = strings.Split(keystone.Key("editor_roles").String(), ",")
484487
KeystoneAdminRoles = strings.Split(keystone.Key("admin_roles").String(), ",")
488+
KeystoneGlobalAdminRoles = strings.Split(keystone.Key("global_admin_roles").String(), ",")
485489

486490
readSessionConfig()
487491
readSmtpSettings()

0 commit comments

Comments
 (0)