Merge branch 'master' of gitee.com:youlaiorg/youlai-boot

This commit is contained in:
hxr
2024-03-21 23:54:26 +08:00
3 changed files with 33 additions and 27 deletions

View File

@@ -1,7 +1,7 @@
<p align="center">
<img alt="有来技术" src="https://img.shields.io/badge/Java -17-brightgreen.svg"/>
<img alt="有来技术" src="https://img.shields.io/badge/SpringBoot-3.2.1-green.svg"/>
<img alt="有来技术" src="https://img.shields.io/badge/SpringBoot-3.2.3-green.svg"/>
<a href="https://gitee.com/youlaitech/youlai-boot" target="_blank">
<img alt="有来技术" src="https://gitee.com/youlaiorg/youlai-boot/badge/star.svg"/>
</a>

View File

@@ -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);

View File

@@ -52,9 +52,7 @@ public class JwtUtils {
}
/**
* 创建Token
* <p>
* 认证成功后的用户信息会被封装到 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<String, Object> 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<SimpleGrantedAuthority> 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<String, Object> parseToken(String token) {
try {
@@ -110,25 +132,5 @@ public class JwtUtils {
return null;
}
/**
* 从 Token 中获取 Authentication
*
* @param payload
* @return
*/
public static UsernamePasswordAuthenticationToken getAuthentication(Map<String, Object> 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<SimpleGrantedAuthority> authorities = ((JSONArray) payload.get(JwtClaimConstants.AUTHORITIES))
.stream()
.map(authority -> new SimpleGrantedAuthority(Convert.toStr(authority)))
.collect(Collectors.toSet());
return new UsernamePasswordAuthenticationToken(userDetails, "", authorities);
}
}