|
|
@@ -5,7 +5,9 @@ import (
|
|
|
"fmt"
|
|
|
|
|
|
"github.com/go-ldap/ldap"
|
|
|
+ "github.com/grafana/grafana/pkg/bus"
|
|
|
"github.com/grafana/grafana/pkg/log"
|
|
|
+ m "github.com/grafana/grafana/pkg/models"
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
|
)
|
|
|
|
|
|
@@ -40,6 +42,24 @@ type ldapUserInfo struct {
|
|
|
MemberOf []string
|
|
|
}
|
|
|
|
|
|
+func (u *ldapUserInfo) isMemberOfAny(groups []string) bool {
|
|
|
+ for _, group := range groups {
|
|
|
+ if u.isMemberOf(group) {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+func (u *ldapUserInfo) isMemberOf(group string) bool {
|
|
|
+ for _, member := range u.MemberOf {
|
|
|
+ if member == group {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
func NewLdapAuthenticator(server *setting.LdapServerConf) *ldapAuther {
|
|
|
return &ldapAuther{
|
|
|
server: server,
|
|
|
@@ -70,16 +90,48 @@ func (a *ldapAuther) login(query *AuthenticateUserQuery) error {
|
|
|
}
|
|
|
|
|
|
// find user entry & attributes
|
|
|
- if user, err := a.searchForUser(query.Username); err != nil {
|
|
|
+ if ldapUser, err := a.searchForUser(query.Username); err != nil {
|
|
|
return err
|
|
|
} else {
|
|
|
- log.Info("Surname: %s", user.LastName)
|
|
|
- log.Info("givenName: %s", user.FirstName)
|
|
|
- log.Info("email: %s", user.Email)
|
|
|
- log.Info("memberOf: %s", user.MemberOf)
|
|
|
+ log.Info("Surname: %s", ldapUser.LastName)
|
|
|
+ log.Info("givenName: %s", ldapUser.FirstName)
|
|
|
+ log.Info("email: %s", ldapUser.Email)
|
|
|
+ log.Info("memberOf: %s", ldapUser.MemberOf)
|
|
|
+
|
|
|
+ if grafanaUser, err := a.getGrafanaUserFor(ldapUser); err != nil {
|
|
|
+ return err
|
|
|
+ } else {
|
|
|
+ query.User = grafanaUser
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (a *ldapAuther) getGrafanaUserFor(ldapUser *ldapUserInfo) (*m.User, error) {
|
|
|
+ // get user from grafana db
|
|
|
+ userQuery := m.GetUserByLoginQuery{LoginOrEmail: ldapUser.Username}
|
|
|
+ if err := bus.Dispatch(&userQuery); err != nil {
|
|
|
+ if err == m.ErrUserNotFound {
|
|
|
+ return a.createGrafanaUser(ldapUser)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return userQuery.Result, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (a *ldapAuther) createGrafanaUser(ldapUser *ldapUserInfo) (*m.User, error) {
|
|
|
+
|
|
|
+ cmd := m.CreateUserCommand{
|
|
|
+ Login: ldapUser.Username,
|
|
|
+ Email: ldapUser.Email,
|
|
|
+ Name: fmt.Sprintf("%s %s", ldapUser.FirstName, ldapUser.LastName),
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := bus.Dispatch(&cmd); err != nil {
|
|
|
+ return nil, err
|
|
|
}
|
|
|
|
|
|
- return errors.New("Aasd")
|
|
|
+ return &cmd.Result, nil
|
|
|
}
|
|
|
|
|
|
func (a *ldapAuther) initialBind(username, userPassword string) error {
|