auth_proxy.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package middleware
  2. import (
  3. "github.com/grafana/grafana/pkg/infra/log"
  4. "github.com/grafana/grafana/pkg/infra/remotecache"
  5. authproxy "github.com/grafana/grafana/pkg/middleware/auth_proxy"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/setting"
  8. )
  9. const (
  10. // cachePrefix is a prefix for the cache key
  11. cachePrefix = authproxy.CachePrefix
  12. )
  13. var header = setting.AuthProxyHeaderName
  14. func initContextWithAuthProxy(store *remotecache.RemoteCache, ctx *m.ReqContext, orgID int64) bool {
  15. username := ctx.Req.Header.Get(header)
  16. auth := authproxy.New(&authproxy.Options{
  17. Store: store,
  18. Ctx: ctx,
  19. OrgID: orgID,
  20. })
  21. logger := log.New("auth.proxy")
  22. // Bail if auth proxy is not enabled
  23. if !auth.IsEnabled() {
  24. return false
  25. }
  26. // If the there is no header - we can't move forward
  27. if !auth.HasHeader() {
  28. return false
  29. }
  30. // Check if allowed to continue with this IP
  31. if result, err := auth.IsAllowedIP(); !result {
  32. logger.Error(
  33. "Failed to check whitelisted IP addresses",
  34. "message", err.Error(),
  35. "error", err.DetailsError,
  36. )
  37. ctx.Handle(407, err.Error(), err.DetailsError)
  38. return true
  39. }
  40. // Try to log in user from various providers
  41. id, err := auth.Login()
  42. if err != nil {
  43. logger.Error(
  44. "Failed to login",
  45. "username", username,
  46. "message", err.Error(),
  47. "error", err.DetailsError,
  48. )
  49. ctx.Handle(407, err.Error(), err.DetailsError)
  50. return true
  51. }
  52. // Get full user info
  53. user, err := auth.GetSignedUser(id)
  54. if err != nil {
  55. logger.Error(
  56. "Failed to get signed user",
  57. "username", username,
  58. "message", err.Error(),
  59. "error", err.DetailsError,
  60. )
  61. ctx.Handle(407, err.Error(), err.DetailsError)
  62. return true
  63. }
  64. // Add user info to context
  65. ctx.SignedInUser = user
  66. ctx.IsSignedIn = true
  67. // Remember user data it in cache
  68. if err := auth.Remember(id); err != nil {
  69. logger.Error(
  70. "Failed to store user in cache",
  71. "username", username,
  72. "message", err.Error(),
  73. "error", err.DetailsError,
  74. )
  75. ctx.Handle(500, err.Error(), err.DetailsError)
  76. return true
  77. }
  78. return true
  79. }