auth.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package login
  2. import (
  3. "errors"
  4. "crypto/subtle"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/setting"
  8. "github.com/grafana/grafana/pkg/util"
  9. )
  10. var (
  11. ErrInvalidCredentials = errors.New("Invalid Username or Password")
  12. )
  13. type LoginUserQuery struct {
  14. Username string
  15. Password string
  16. User *m.User
  17. }
  18. func Init() {
  19. bus.AddHandler("auth", AuthenticateUser)
  20. loadLdapConfig()
  21. }
  22. func AuthenticateUser(query *LoginUserQuery) error {
  23. err := loginUsingGrafanaDB(query)
  24. if err == nil || err != ErrInvalidCredentials {
  25. return err
  26. }
  27. if setting.LdapEnabled {
  28. for _, server := range ldapCfg.Servers {
  29. auther := NewLdapAuthenticator(server)
  30. err = auther.login(query)
  31. if err == nil || err != ErrInvalidCredentials {
  32. return err
  33. }
  34. }
  35. }
  36. return err
  37. }
  38. func loginUsingGrafanaDB(query *LoginUserQuery) error {
  39. userQuery := m.GetUserByLoginQuery{LoginOrEmail: query.Username}
  40. if err := bus.Dispatch(&userQuery); err != nil {
  41. if err == m.ErrUserNotFound {
  42. return ErrInvalidCredentials
  43. }
  44. return err
  45. }
  46. user := userQuery.Result
  47. passwordHashed := util.EncodePassword(query.Password, user.Salt)
  48. if subtle.ConstantTimeCompare([]byte(passwordHashed), []byte(user.Password)) != 1 {
  49. return ErrInvalidCredentials
  50. }
  51. query.User = user
  52. return nil
  53. }