auth_proxy.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package middleware
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. "github.com/grafana/grafana/pkg/log"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/setting"
  7. )
  8. func initContextWithAuthProxy(ctx *Context) bool {
  9. if !setting.AuthProxyEnabled {
  10. return false
  11. }
  12. proxyHeaderValue := ctx.Req.Header.Get(setting.AuthProxyHeaderName)
  13. if len(proxyHeaderValue) == 0 {
  14. return false
  15. }
  16. query := getSignedInUserQueryForProxyAuth(proxyHeaderValue)
  17. if err := bus.Dispatch(query); err != nil {
  18. if err != m.ErrUserNotFound {
  19. ctx.Handle(500, "Failed find user specifed in auth proxy header", err)
  20. return true
  21. }
  22. if setting.AuthProxyAutoSignUp {
  23. cmd := getCreateUserCommandForProxyAuth(proxyHeaderValue)
  24. if err := bus.Dispatch(cmd); err != nil {
  25. ctx.Handle(500, "Failed to create user specified in auth proxy header", err)
  26. return true
  27. }
  28. query = &m.GetSignedInUserQuery{UserId: cmd.Result.Id}
  29. if err := bus.Dispatch(query); err != nil {
  30. ctx.Handle(500, "Failed find user after creation", err)
  31. return true
  32. }
  33. } else {
  34. return false
  35. }
  36. }
  37. // initialize session
  38. if err := ctx.Session.Start(ctx); err != nil {
  39. log.Error(3, "Failed to start session", err)
  40. return false
  41. }
  42. ctx.SignedInUser = query.Result
  43. ctx.IsSignedIn = true
  44. ctx.Session.Set(SESS_KEY_USERID, ctx.UserId)
  45. return true
  46. }
  47. func getSignedInUserQueryForProxyAuth(headerVal string) *m.GetSignedInUserQuery {
  48. query := m.GetSignedInUserQuery{}
  49. if setting.AuthProxyHeaderProperty == "username" {
  50. query.Login = headerVal
  51. } else if setting.AuthProxyHeaderProperty == "email" {
  52. query.Email = headerVal
  53. } else {
  54. panic("Auth proxy header property invalid")
  55. }
  56. return &query
  57. }
  58. func getCreateUserCommandForProxyAuth(headerVal string) *m.CreateUserCommand {
  59. cmd := m.CreateUserCommand{}
  60. if setting.AuthProxyHeaderProperty == "username" {
  61. cmd.Login = headerVal
  62. cmd.Email = headerVal
  63. } else if setting.AuthProxyHeaderProperty == "email" {
  64. cmd.Email = headerVal
  65. cmd.Login = headerVal
  66. } else {
  67. panic("Auth proxy header property invalid")
  68. }
  69. return &cmd
  70. }