Golang Echo - 中间件在不返回下一个时仍在执行下一个路由
Golang Echo - middleware still executing next route when not returning next
我正在尝试使用身份验证中间件来检查用户当前是否已连接并在执行路由之前进行会话,但我的中间件似乎没有停止路由的执行甚至执行下一个我不会调用 next()。
这是我的代码:
func checkUserAuth(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if err := next(c); err != nil {
c.Error(err)
}
currSess, _ := session.Get("session", c)
if userId, ok := currSess.Values["user_id"].(string); ok {
fmt.Println("User is currently connected with id", userId);
return next(c)
}
// Even if middleware reaches here, it still execute the next route, why?
return echo.ErrUnauthorized
}
}
func main() {
e := echo.New()
e.Use(checkUserAuth)
e.Use(session.Middleware(store))
e.GET("/", func(c echo.Context) error {
sess, _ := session.Get("session", c)
fmt.Println("got session" , sess.Values["user_id"], "id", sess.ID)
return c.String(http.StatusOK, "Hello")
})
e.GET("/session", func(c echo.Context) error {
sess, _ := session.Get("session", c)
//test
sess.Values["user_id"] = rand.Intn(50000)
sess.Save(c.Request(), c.Response())
return c.String(http.StatusOK, "session saved")
})
当我向 /
路由发送 GET 请求时,中间件被正确执行并到达 return echo.ErrUnauthorized
语句,但是无论如何 /
仍然被执行,我没有'得到任何 401 状态代码。
谢谢
在您的 checkUserAuth
上删除
if err := next(c); err != nil {
c.Error(err)
}
next() 首先在您的中间件中触发。
我正在尝试使用身份验证中间件来检查用户当前是否已连接并在执行路由之前进行会话,但我的中间件似乎没有停止路由的执行甚至执行下一个我不会调用 next()。
这是我的代码:
func checkUserAuth(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if err := next(c); err != nil {
c.Error(err)
}
currSess, _ := session.Get("session", c)
if userId, ok := currSess.Values["user_id"].(string); ok {
fmt.Println("User is currently connected with id", userId);
return next(c)
}
// Even if middleware reaches here, it still execute the next route, why?
return echo.ErrUnauthorized
}
}
func main() {
e := echo.New()
e.Use(checkUserAuth)
e.Use(session.Middleware(store))
e.GET("/", func(c echo.Context) error {
sess, _ := session.Get("session", c)
fmt.Println("got session" , sess.Values["user_id"], "id", sess.ID)
return c.String(http.StatusOK, "Hello")
})
e.GET("/session", func(c echo.Context) error {
sess, _ := session.Get("session", c)
//test
sess.Values["user_id"] = rand.Intn(50000)
sess.Save(c.Request(), c.Response())
return c.String(http.StatusOK, "session saved")
})
当我向 /
路由发送 GET 请求时,中间件被正确执行并到达 return echo.ErrUnauthorized
语句,但是无论如何 /
仍然被执行,我没有'得到任何 401 状态代码。
谢谢
在您的 checkUserAuth
上删除
if err := next(c); err != nil {
c.Error(err)
}
next() 首先在您的中间件中触发。