ldap_login.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package login
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. "github.com/grafana/grafana/pkg/infra/log"
  5. "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/services/ldap"
  7. "github.com/grafana/grafana/pkg/services/multildap"
  8. "github.com/grafana/grafana/pkg/setting"
  9. "github.com/grafana/grafana/pkg/util/errutil"
  10. )
  11. // getLDAPConfig gets LDAP config
  12. var getLDAPConfig = multildap.GetConfig
  13. // isLDAPEnabled checks if LDAP is enabled
  14. var isLDAPEnabled = multildap.IsEnabled
  15. // newLDAP creates multiple LDAP instance
  16. var newLDAP = multildap.New
  17. // logger for the LDAP auth
  18. var logger = log.New("login.ldap")
  19. // loginUsingLDAP logs in user using LDAP. It returns whether LDAP is enabled and optional error and query arg will be
  20. // populated with the logged in user if successful.
  21. var loginUsingLDAP = func(query *models.LoginUserQuery) (bool, error) {
  22. enabled := isLDAPEnabled()
  23. if !enabled {
  24. return false, nil
  25. }
  26. config, err := getLDAPConfig()
  27. if err != nil {
  28. return true, errutil.Wrap("Failed to get LDAP config", err)
  29. }
  30. externalUser, err := newLDAP(config.Servers).Login(query)
  31. if err != nil {
  32. if err == ldap.ErrCouldNotFindUser {
  33. // Ignore the error since user might not be present anyway
  34. DisableExternalUser(query.Username)
  35. return true, ldap.ErrInvalidCredentials
  36. }
  37. return true, err
  38. }
  39. upsert := &models.UpsertUserCommand{
  40. ExternalUser: externalUser,
  41. SignupAllowed: setting.LDAPAllowSignup,
  42. }
  43. err = bus.Dispatch(upsert)
  44. if err != nil {
  45. return true, err
  46. }
  47. query.User = upsert.Result
  48. return true, nil
  49. }
  50. // DisableExternalUser marks external user as disabled in Grafana db
  51. func DisableExternalUser(username string) error {
  52. // Check if external user exist in Grafana
  53. userQuery := &models.GetExternalUserInfoByLoginQuery{
  54. LoginOrEmail: username,
  55. }
  56. if err := bus.Dispatch(userQuery); err != nil {
  57. return err
  58. }
  59. userInfo := userQuery.Result
  60. if !userInfo.IsDisabled {
  61. logger.Debug(
  62. "Disabling external user",
  63. "user",
  64. userQuery.Result.Login,
  65. )
  66. // Mark user as disabled in grafana db
  67. disableUserCmd := &models.DisableUserCommand{
  68. UserId: userQuery.Result.UserId,
  69. IsDisabled: true,
  70. }
  71. if err := bus.Dispatch(disableUserCmd); err != nil {
  72. logger.Debug(
  73. "Error disabling external user",
  74. "user",
  75. userQuery.Result.Login,
  76. "message",
  77. err.Error(),
  78. )
  79. return err
  80. }
  81. }
  82. return nil
  83. }