【问题标题】:Authentication middleware not working in Gin身份验证中间件在 Gin 中不起作用
【发布时间】: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 或其他存储中,其中可能包含全局变量。

标签: go go-gin


【解决方案1】:

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

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

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

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

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
猜你喜欢
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2015-02-25
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多