身份验证中间件在 Gin 中不起作用

Sam*_*rei 5 go go-gin

我有以下路线和会话设置:

func SetupRouter() *gin.Engine {
    r := gin.Default()

    // Session
    store := cookie.NewStore([]byte("secret"))
    // Set session expiration time
    store.Options(sessions.Options{MaxAge: 3600 * 24}) // 24hr
    r.Use(sessions.Sessions("mysession", store))

    r.GET("api/business/", controllers.GetBusiness)
    r.POST("api/business/login", controllers.Login)
    r.GET("api/business/logout", controllers.Logout)
    r.GET("api/business/session", controllers.GetBusinessSession)
    r.POST(
        "api/itemcategory/add", 
        // isBusinessAuth(), 
        controllers.CreateItemCategory,
    )
    r.POST(
        "api/itemcategory/delete/:id",
        // isBusinessAuth(),
        controllers.DeleteItemCategory,
    )
    r.GET(
        "api/itemcategory/all",
        // isBusinessAuth(),
        controllers.GetAllItemCategories,
    )
    r.POST(
        "api/itemcategory/update/:id",
        // isBusinessAuth(),
        controllers.CreateItemCategory,
    )

    return r
}
Run Code Online (Sandbox Code Playgroud)

功能isBusinessAuth()

func isBusinessAuth() gin.HandlerFunc {
    return func(c *gin.Context) {
        if sessions.Default(c).Get("businessAuth") == 1 {
            c.Next()
            return
        } else {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "You are not authorized!"})
        }
        c.Abort()
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是登录函数中会话的放置方式:

// Set business session
session.Set("businessAuth", 1)
session.Save()
Run Code Online (Sandbox Code Playgroud)

无论会话具有什么值,isBusinessAuth()对于使用的所有路由都会返回“您未经授权”。我尝试将其放在“/api/business/login”和“/api/business/session”路线上,并且按预期工作。我缺少什么?

谢谢 :)

wei*_*Lee 0

这需要客户端能够保存cookie,您可以使用Chrome进行测试

会话通信一般是通过cookie来实现的。与cookie不同的是,session只在客户端保存一个sessionID。与cookie不同的是,session的具体数据只保存在服务器端,而不是客户端

在Servlet中,会话数据被封装在一个对象中,该对象将被存储在对象池中。客户端发出请求时,会带上自己的sessionID,服务器根据这个sessionID从对象池中获取对应的session对象。从对象获取会话数据。服务器使用此会话数据来维护或更改与客户端的会话状态。

客户端访问服务器时,会检查客户端请求数据中是否包含SessionID。如果没有,则认为客户端是第一次访问服务器