diff --git a/README.md b/README.md index b1b79660..dee2b480 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

有来技术 - 有来技术 + 有来技术 有来技术 diff --git a/src/main/java/com/youlai/system/config/WebSocketConfig.java b/src/main/java/com/youlai/system/config/WebSocketConfig.java index 75f8ed21..fdf86e20 100644 --- a/src/main/java/com/youlai/system/config/WebSocketConfig.java +++ b/src/main/java/com/youlai/system/config/WebSocketConfig.java @@ -1,6 +1,7 @@ package com.youlai.system.config; import cn.hutool.core.util.StrUtil; +import cn.hutool.jwt.JWTPayload; import com.youlai.system.security.util.JwtUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; @@ -79,7 +80,10 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith("Bearer ")) { try { // 移除 "Bearer " 前缀,从令牌中提取用户信息(username), 并设置到认证信息中 - String username = JwtUtils.parseToken(bearerToken).get("name").toString(); + + // 这里不应该用"name" + // String username = JwtUtils.parseToken(bearerToken).get("name").toString(); + String username = JwtUtils.parseToken(bearerToken).get(JWTPayload.SUBJECT).toString(); if (StrUtil.isNotBlank(username)) { accessor.setUser(() -> username); diff --git a/src/main/java/com/youlai/system/security/util/JwtUtils.java b/src/main/java/com/youlai/system/security/util/JwtUtils.java index ca8fb2f4..447e1dc3 100644 --- a/src/main/java/com/youlai/system/security/util/JwtUtils.java +++ b/src/main/java/com/youlai/system/security/util/JwtUtils.java @@ -52,9 +52,7 @@ public class JwtUtils { } /** - * 创建Token - *

- * 认证成功后的用户信息会被封装到 Authentication 对象中,然后通过 JwtTokenProvider#createToken(Authentication) 方法创建 Token 字符串 + * 生成 JWT Token * * @param authentication 用户认证信息 * @return Token 字符串 @@ -85,11 +83,35 @@ public class JwtUtils { return JWTUtil.createToken(payload, JwtUtils.key); } + /** - * 从 Token 中解析数据 + * 从 JWT Token 中解析 Authentication 用户认证信息 + * + * @param payload JWT 载体 + * @return 用户认证信息 + */ + public static UsernamePasswordAuthenticationToken getAuthentication(Map payload) { + SysUserDetails userDetails = new SysUserDetails(); + userDetails.setUserId(Convert.toLong(payload.get(JwtClaimConstants.USER_ID))); // 用户ID + userDetails.setDeptId(Convert.toLong(payload.get(JwtClaimConstants.DEPT_ID))); // 部门ID + userDetails.setDataScope(Convert.toInt(payload.get(JwtClaimConstants.DATA_SCOPE))); // 数据权限范围 + + userDetails.setUsername(Convert.toStr(payload.get(JWTPayload.SUBJECT))); // 用户名 + // 角色集合 + Set authorities = ((JSONArray) payload.get(JwtClaimConstants.AUTHORITIES)) + .stream() + .map(authority -> new SimpleGrantedAuthority(Convert.toStr(authority))) + .collect(Collectors.toSet()); + + return new UsernamePasswordAuthenticationToken(userDetails, "", authorities); + } + + + /** + * 解析 JWT Token 获取载体信息 * * @param token JWT Token - * @return 解析数据 + * @return 载体信息 */ public static Map parseToken(String token) { try { @@ -110,25 +132,5 @@ public class JwtUtils { return null; } - /** - * 从 Token 中获取 Authentication - * - * @param payload - * @return - */ - public static UsernamePasswordAuthenticationToken getAuthentication(Map payload) { - SysUserDetails userDetails = new SysUserDetails(); - userDetails.setUserId(Convert.toLong(payload.get(JwtClaimConstants.USER_ID))); // 用户ID - userDetails.setDeptId(Convert.toLong(payload.get(JwtClaimConstants.DEPT_ID))); // 部门ID - userDetails.setDataScope(Convert.toInt(payload.get(JwtClaimConstants.DATA_SCOPE))); // 数据权限范围 - userDetails.setUsername(Convert.toStr(payload.get(JWTPayload.SUBJECT))); // 用户名 - // 角色集合 - Set authorities = ((JSONArray) payload.get(JwtClaimConstants.AUTHORITIES)) - .stream() - .map(authority -> new SimpleGrantedAuthority(Convert.toStr(authority))) - .collect(Collectors.toSet()); - - return new UsernamePasswordAuthenticationToken(userDetails, "", authorities); - } }