0

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

这是我的代码:


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

谢谢

4

1 回答 1

1

在你checkUserAuth删除

if err := next(c); err != nil {
    c.Error(err)
}

next() 首先在您的中间件中触发。

于 2022-01-13T15:39:17.330 回答