在 Sa-Token
框架中,后端获取用户 ID 的过程与前端传递的参数密切相关。Sa-Token
是一个基于 JWT 的轻量级权限管理框架,主要用于解决权限控制、登录管理等问题。具体来说,后端如何获取用户 ID,取决于你前后端如何设计以及 Sa-Token
的配置。
原理解析
-
前端如何传递用户标识信息:
-
后端如何提取用户 ID: 后端可以通过
Sa-Token
提供的工具方法来解析客户端传递的令牌,从中提取出用户的标识信息(如用户 ID)。具体的流程如下:- 步骤 1:客户端将令牌传递给后端(通常是放在请求头的
Authorization
字段)。 - 步骤 2:后端接收到请求后,使用
Sa-Token
框架提供的 API(比如StpUtil.getLoginId()
)从令牌中提取出用户的登录 ID。
- 步骤 1:客户端将令牌传递给后端(通常是放在请求头的
-
Sa-Token
后端获取用户 ID 的方法:Sa-Token
框架提供了一个方便的工具类StpUtil
来操作和管理用户的认证信息。具体来说,StpUtil.getLoginId()
方法可以直接获取当前登录用户的 ID。Sa-Token
会从请求中的令牌中解析出用户的身份信息,并且默认情况下会把用户的 ID 存储在token
对象中。-
获取当前登录用户的 ID:
javaCopy Code
String userId = StpUtil.getLoginId();
-
StpUtil.getLoginId()
会自动从请求头的Authorization
中获取令牌,解析并返回用户的 ID。如果令牌有效且没有过期,框架会解析出其中的用户信息。
-
-
令牌的原理:
Sa-Token
使用的是无状态的令牌(通常是 JWT)。JWT 中会存储用户的标识信息(如用户 ID)。该令牌通过加密签名的方式保证其不被篡改。后端通过验证签名来确保令牌的有效性,进而从中提取出用户 ID。
流程总结:
- 用户登录成功,前端从后端获取一个包含用户信息的令牌(通常是 JWT)。
- 前端将该令牌保存在本地存储(如
localStorage
、sessionStorage
、cookie
)中。 - 前端在每次请求时,将令牌放入请求头中,通常是
Authorization
字段。 - 后端通过
StpUtil.getLoginId()
方法,从请求头中获取并验证令牌,解析出其中的用户 ID(或登录 ID)。 - 后端使用获取到的用户 ID 进行权限控制、数据访问等操作。
例子:
-
前端发送请求: 假设前端将令牌保存在
localStorage
中,并且每次请求时将令牌放入请求头:javascriptCopy Code
const token = localStorage.getItem("token"); // 获取存储的token fetch('https://your-api.com/endpoint', { method: 'GET', headers: { 'Authorization': `Bearer ${token}`, // 传递 token }, });
-
后端解析令牌并获取用户 ID: 在后端的控制器或服务中,使用
StpUtil.getLoginId()
获取用户 ID:javaCopy Code
@RestController public class MyController { @GetMapping("/endpoint") public String getUserInfo() { // 获取当前登录的用户ID String userId = StpUtil.getLoginId(); return "当前登录用户的ID是: " + userId; } }
-
JWT 内的用户标识: 令牌中的 payload 可能包含如下信息(例如一个 JWT):
jsonCopy Code
{ "sub": "1234567890", // 用户ID "name": "John Doe", "iat": 1516239022 }
总结:
后端获取用户 ID 的原理基于以下几点:
- 前端通过
Authorization
请求头传递登录令牌(如 JWT)。 - 后端通过
Sa-Token
提供的工具方法(如StpUtil.getLoginId()
)获取令牌,并从中解析出用户 ID。 Sa-Token
提供了简洁的 API 和内置机制,帮助后端轻松管理用户认证和权限。
这样,后端就可以通过从请求头中解析得到的令牌,提取出当前登录的用户 ID,进行后续的权限验证和业务逻辑处理。