开发喵星球

若依分离版集成magic-api获取用户信息(363)

RuoYi-Vue 项目中,magic-api 的集成让接口开发变得更加轻松和高效。通常情况下,我们在开发过程中需要获取用户的登录信息,如使用 SecurityUtilsTokenService 来解析用户的身份。然而,直接在 magic-api 中使用这些工具来获取用户信息时,可能会遇到无法正常执行的问题。本文将介绍这个问题的成因,并提供具体的解决方案。

一、问题描述

当 RuoYi-Vue 项目集成了 magic-api 后,开发者尝试通过 magic-api 调用 RuoYi 框架的 SecurityUtilsTokenService 来获取用户登录信息时,通常会出现错误,导致无法正常获取用户数据。这使得用户信息的管理和使用变得不便。

二、原因分析

RuoYi 项目中,SecurityUtilsTokenService 主要依赖于 HttpRequest 流来提取请求头(header)中的 Authorization 信息,进而解析并获取用户的登录信息。然而,在 magic-api 中,使用 import 语法引入 SecurityUtilsTokenService 时,HTTP 流并没有传递到 magic-api 的运行环境中。这种情况下,无法正常提取 Authorization 令牌,导致调用时返回 401 错误,即未授权访问。

三、解决思路

为了解决这个问题,可以通过调整 TokenService 类来提供一种在 magic-api 环境下解析 Authorization 的方式。具体做法是,在 TokenService 中新增一个公共方法,允许直接传递 Authorization 信息,并解析令牌以获取用户数据。

解决步骤

1. 在 TokenService 中新增公共方法 getLoginUser

位置:ruoyi/framework/web/service/TokenService.java
在该类中新增一个方法,该方法将允许我们直接传递 Authorization 令牌,并获取用户信息。

/**
 * 加这个方法即可
 *
 * @return 用户信息
 */
public LoginUser getLoginUser(String authorization) {
    // 获取请求携带的令牌
    String token = getToken(authorization);
    return getLoginUserFromRedis(token);

}

private LoginUser getLoginUserFromRedis(String token) {
    if (StringUtils.isNotEmpty(token)) {
        try {
            Claims claims = parseToken(token);
            // 解析对应的权限以及用户信息
            String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
            String userKey = getTokenKey(uuid);
            LoginUser user = redisCache.getCacheObject(userKey);
            return user;
        } catch (Exception e) {}
    }
    return null;
}

该方法通过传入 Authorization 令牌,调用内部的 getLoginUserFromRedis 方法来从 Redis 缓存中获取对应的用户信息。这样做可以绕过 HTTP 流的限制,直接从传入的 Authorization 信息中获取用户登录状态。

2. 在 magic-api 中调用 getLoginUser 方法

当我们通过 magic-api 开发接口时,可以利用刚刚新增的 getLoginUser 方法来获取用户信息。

具体调用方式如下:

import "tokenService" as tokenService;

// 从请求头中获取 Authorization 信息
var token = header.Authorization;

// 调用 TokenService 获取登录用户信息
var userInfo = tokenService.getLoginUser(token);

// 返回用户信息
return userInfo;

这里,我们首先通过 header.Authorization 获取传递的 Authorization 信息,然后调用 tokenService.getLoginUser(token) 方法来解析该令牌,并返回用户信息。这样做可以确保我们在 magic-api 的环境下也能够获取登录用户的信息。

3. 执行效果

当你正确执行上面的步骤后,便可以在 magic-api 的接口中成功调用用户信息。执行效果如下图所示:

执行效果图

四、其他注意事项

在实际开发过程中,如果你发现使用 magic-api 调试用户信息时无法成功获取 Authorization 令牌,可能是因为没有在全局请求头中添加对应的 Authorization 信息。

如何解决?

  1. 通过浏览器调试工具获取 Authorization 信息: 登录系统后,按下 F12 打开浏览器调试工具,在请求中获取 Authorization 的具体值。
    在全局添加 Authorization 信息
  2. magic-api 中添加全局请求头: 将获取到的 Authorization 信息添加到 magic-api 的全局请求头中。具体操作如下:
    通过这种方式,magic-api 中的每个请求都将带有 Authorization 头,确保我们能够正确解析用户身份。

总结

通过上述方法,我们成功地在 RuoYi-Vue 中解决了 magic-api 无法直接获取用户登录信息的问题。核心思路是在 TokenService 中新增一个可以直接解析 Authorization 的方法,绕过 HTTP 流的限制。这种方法确保了在 magic-api 环境中,我们也能够灵活、安全地获取用户信息并加以应用。

✅ 希望这篇文章能帮助你解决在开发中的类似问题!

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-10-16 16:49:12 阅读量:124
<<   >>


powered by kaifamiao