【发布时间】:2021-09-03 08:55:18
【问题描述】:
我有以下路线和会话设置:
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
}
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
}
}
这是在登录功能中放置会话的方式:
// Set business session
session.Set("businessAuth", 1)
session.Save()
无论会话的值是什么,isBusinessAuth() 都会为所有使用的路由返回“您未获得授权”。我试图把它放在“/api/business/login”和“/api/business/session”路由上,并且按预期工作。我错过了什么?
谢谢你:)
【问题讨论】:
-
显而易见的问题:如何将“businessAuth”放入上下文中?什么是 session.Default?
-
我更新了问题
-
如何将
session置于上下文中?它在调用之间存储在哪里? -
我认为我没有正确理解您的问题。会话不是全局存储的吗?我正在使用这个:github.com/gin-contrib/sessions 用于会话
-
这就是我要去的地方。该库是否存储您的会话?如果不是,每个调用都是独立的,您无法保留状态。您必须将该会话存储在 cookie 或其他存储中,其中可能包含全局变量。