未登录踢回登录页面及用户id穿透

一、未登录

        当用户请求受保护的接口时,要先判断用户是否处于登录状态,未登录踢回登录页面,使用重定向使用户处在登陆页面。

        重定向两个重要的参数:重定向状态码,302.  重定向url,登陆页面url

注意重定向的时候需要保存原始的请求地址,以便登录成功后直接反返回原始的请求地址.

    //重定向方法
    private Mono<Void> locationUrl(ServerWebExchange exchange) {
        //获取原始请求的地址,登录成功后直接跳转到原始的请求地址
        String path = exchange.getRequest().getURI().toString();
        ServerHttpResponse httpResponse = exchange.getResponse();
        //重定向状态码 302
        httpResponse.setStatusCode(HttpStatus.FOUND);
        //重定向地址
        httpResponse.getHeaders().set("Location", authUrlProperties.getLoginPageUrl()+"?originUrl=" + path);

        return httpResponse.setComplete();
    }

二、用户id穿透

        让购物车模块使用用户id来存储相应用户的订单,或者其他微服务模块可能使用用户id。

解决方案:

        方案一:在每一个微服务中获取单独获取Cookie中的token或者header中的token,然后根据token从Redis中查询用户数据得到用户id

        方案二:在网关中统一获取token,统一查询Redis获取用户id,并且进行id透传

实现思路:构建一个新的request对象,然后把用户id存入请求头中,放行的时候使用新的请求对象

 

    private void userIdThrought(ServerWebExchange exchange, GatewayFilterChain chain, UserInfo userInfo) {
        /**
         * 实现思路:构建一个新的request对象,然后把用户id存入请求头中,放行的时候使用新的请求对象
         */
        //获取用户id
        Long userInfoId = userInfo.getId();
        //获取请求对象
        ServerHttpRequest httpRequest = exchange.getRequest();
        //构建新的请求头对象把用户id放进去
        ServerHttpRequest serverHttpRequest = httpRequest.mutate().header("userId", userInfoId.toString()).build();

        //构建新的exchange对象并封装request对象(一般封装request和response对象,response对象使用原来的就行)
        ServerWebExchange serverWebExchange = exchange.mutate().request(serverHttpRequest).response(exchange.getResponse()).build();
        //放行
        chain.filter(serverWebExchange);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值