猿问

Golang Echo - 中间件在不返回下一个时仍在执行下一个路由

我正在尝试使用身份验证中间件来检查用户当前是否已连接并且在执行路由之前是否有会话,但似乎我的中间件并没有停止路由的执行并执行下一个路由,即使我没有调用下一个()。


这是我的代码:



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 状态代码。


慕码人2483693
浏览 71回答 1
1回答

狐的传说

在你checkUserAuth删除if err := next(c); err != nil {    c.Error(err)}next() 首先在您的中间件中触发。
随时随地看视频慕课网APP

相关分类

Go
我要回答