Gin使用Session中间件获取当前登录用户

本文介绍如何在Gin使用gin-contrib/sessions中间件实现session登录鉴权。详细讲解了设置session、通过session获取用户信息以及处理结构体存储的步骤,包括gob注册结构体的重要性。通过示例代码展示登录接口和获取当前登录用户信息的接口实现。
摘要由CSDN通过智能技术生成

简介

最近在使用Gin重构之前的SpringBoot后台,虽然现在使用JWT来做登录鉴权比较流行,但是为了保持接口的一致性还是选择使用session机制来做登录鉴权,在Gin中使用得比较多的session中间件是gin-contrib/sessions,项目的GitHub上有简单使用教程,这里记录一下对其的封装,能通过session获取到当前登录用户的信息。

需求

之前的SpringBoot项目大致可以看作是一个微型的Blog平台,有许多操作如更新、删除文章通常要鉴定权限,只有本人才能更新、删除,当时的设计是当用户登录时用seesion存储用户的基本信息(ID、Email等),之后调用更新、删除API时就只用传文章相关的参数,不需要传用户参数(用户参数可以通过header中的sessionId获取)。当时使用的Shiro来管理session,通过调用Shiro的SecurityUtils就能获取到session数据,由于有许多接口都可能要用到当前登录用户的信息,所以写了一个BaseController来封装通过session读取用户信息,之后需要用到这个功能的Controller就继承BaseController。


import org.apache.shiro.SecurityUtils;

public abstract class BaseController {
   
    /**
     * 返回当前登录用户信息,User是自定义的用户类,存储用户ID、Email等信息
     * @return
     */
    protected User getCurrentUser(){
   
    // 调用Shiro相关接口即可,都不需要上下文参数
        return (User) SecurityUtils.getSubject().getSession().getAttribute("currentUser");
    }

    /**
     * 设置当前登录用户的信息
     * @param user
     */
    protected void setCurrentUser(User user){
   
        SecurityUtils.getSubject().getSession().setAttribute("currentUser", user);
    }
}

在Gin中使用Session

gin-contrib/sessions官方给出的使用教程如下"secret"表示的是生成sessionID时的密钥,随便填个字符串就行;"mysession"表示的是返回给前端的sessionId名称,比如我填"SESSIONID"那么返回給前端的cookie数据就有SESSIONID这个字段

<
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gin 框架中,你可以使用中间件来实现获取当前登录用户的 ID。下面是一个示例代码,演示了如何在 Gin 框架中获取当前登录用户的 ID: ```go // 定义一个中间件函数,用于验证用户是否登录 func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 在这里进行用户登录验证的逻辑 // 假设验证成功,并且从验证结果中获取用户的 ID userID := "123" // 假设用户 ID 是 "123" // 将用户 ID 存储到 Context 中 c.Set("userID", userID) c.Next() } } // 在路由中使用中间件 func main() { r := gin.Default() // 使用 AuthMiddleware 中间件 r.Use(AuthMiddleware()) // 定义一个需要获取当前登录用户 ID 的路由 r.GET("/user/id", func(c *gin.Context) { // 从 Context 中获取用户 ID userID, exists := c.Get("userID") if !exists { c.JSON(http.StatusUnauthorized, gin.H{ "error": "未登录", }) return } c.JSON(http.StatusOK, gin.H{ "userID": userID, }) }) r.Run(":8080") } ``` 在上述示例中,我们定义了一个名为 `AuthMiddleware` 的中间件函数,用于验证用户是否登录。在验证成功后,我们将用户 ID 存储到 Gin 的 Context 中,然后可以在后续的路由处理函数中通过 `c.Get("userID")` 获取当前登录用户的 ID。 当访问 `/user/id` 路径时,如果用户登录,将返回当前登录用户的 ID;如果用户登录,将返回未登录的错误信息。请根据你的实际情况进行修改和适配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值