api_login.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package api
  2. import "github.com/gin-gonic/gin"
  3. func init() {
  4. addRoutes(func(self *HttpServer) {
  5. self.router.GET("/login/*_", self.index)
  6. self.router.POST("/login", self.loginPost)
  7. self.router.POST("/logout", self.logoutPost)
  8. })
  9. }
  10. type loginJsonModel struct {
  11. Email string `json:"email" binding:"required"`
  12. Password string `json:"password" binding:"required"`
  13. Remember bool `json:"remember"`
  14. }
  15. func (self *HttpServer) loginPost(c *gin.Context) {
  16. var loginModel loginJsonModel
  17. if !c.EnsureBody(&loginModel) {
  18. c.JSON(400, gin.H{"status": "bad request"})
  19. return
  20. }
  21. account, err := self.store.GetUserAccountLogin(loginModel.Email)
  22. if err != nil {
  23. c.JSON(400, gin.H{"status": "some error"})
  24. }
  25. if loginModel.Password != account.Password {
  26. c.JSON(401, gin.H{"status": "unauthorized"})
  27. return
  28. }
  29. session, _ := sessionStore.Get(c.Request, "grafana-session")
  30. session.Values["login"] = loginModel.Email
  31. session.Values["accountId"] = account.DatabaseId
  32. session.Save(c.Request, c.Writer)
  33. var resp = &LoginResultDto{}
  34. resp.Status = "Logged in"
  35. resp.User.Login = account.Login
  36. c.JSON(200, resp)
  37. }
  38. func (self *HttpServer) logoutPost(c *gin.Context) {
  39. session, _ := sessionStore.Get(c.Request, "grafana-session")
  40. session.Values["login"] = nil
  41. session.Save(c.Request, c.Writer)
  42. c.JSON(200, gin.H{"status": "logged out"})
  43. }
  44. type GrafanaReqContext struct {
  45. }
  46. type authenticatedAuthRouteFunc func(c *gin.Context, grc GrafanaReqContext)
  47. func (self *HttpServer) addAuthRoute(route string, handler authenticatedAuthRouteFunc) {
  48. self.router.GET(route, self.auth(), func(c *gin.Context) {
  49. })
  50. }
  51. func (self *HttpServer) auth() gin.HandlerFunc {
  52. return func(c *gin.Context) {
  53. session, _ := sessionStore.Get(c.Request, "grafana-session")
  54. if c.Request.URL.Path != "/login" && session.Values["login"] == nil {
  55. c.Writer.Header().Set("Location", "/login")
  56. c.Abort(302)
  57. return
  58. }
  59. c.Set("accountId", session.Values["accountId"])
  60. c.Set("login", session.Values["login"])
  61. session.Save(c.Request, c.Writer)
  62. }
  63. }