auth.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package auth
  2. import (
  3. "errors"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/setting"
  7. "github.com/grafana/grafana/pkg/util"
  8. )
  9. var (
  10. ErrInvalidCredentials = errors.New("Invalid Username or Password")
  11. )
  12. type LoginSettings struct {
  13. LdapEnabled bool
  14. }
  15. type LdapFilterToOrg struct {
  16. Filter string
  17. OrgId int
  18. OrgRole string
  19. }
  20. type LdapSettings struct {
  21. Enabled bool
  22. Hosts []string
  23. UseSSL bool
  24. BindDN string
  25. AttrUsername string
  26. AttrName string
  27. AttrSurname string
  28. AttrMail string
  29. Filters []LdapFilterToOrg
  30. }
  31. type AuthSource interface {
  32. AuthenticateUser(username, password string) (*m.User, error)
  33. }
  34. type AuthenticateUserQuery struct {
  35. Username string
  36. Password string
  37. User *m.User
  38. }
  39. func init() {
  40. bus.AddHandler("auth", AuthenticateUser)
  41. }
  42. func AuthenticateUser(query *AuthenticateUserQuery) error {
  43. err := loginUsingGrafanaDB(query)
  44. if err == nil || err != ErrInvalidCredentials {
  45. return err
  46. }
  47. if setting.LdapEnabled {
  48. err = loginUsingLdap(query)
  49. }
  50. return err
  51. }
  52. func loginUsingGrafanaDB(query *AuthenticateUserQuery) error {
  53. userQuery := m.GetUserByLoginQuery{LoginOrEmail: query.Username}
  54. if err := bus.Dispatch(&userQuery); err != nil {
  55. if err == m.ErrUserNotFound {
  56. return ErrInvalidCredentials
  57. }
  58. return err
  59. }
  60. user := userQuery.Result
  61. passwordHashed := util.EncodePassword(query.Password, user.Salt)
  62. if passwordHashed != user.Password {
  63. return ErrInvalidCredentials
  64. }
  65. query.User = user
  66. return nil
  67. }