package com.backendsys.config.Security.utils; import cn.hutool.core.convert.Convert; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.backendsys.config.Security.entity.SecurityUserInfo; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.Map; public class SecurityUtil { private static final String SECRET_KEY = "452948404D635166546A576E5A7134743777217A25432A462D4A614E64526755"; private static SecretKey getSignInKey() { byte[] bytes = Base64.getDecoder().decode(SECRET_KEY.getBytes(StandardCharsets.UTF_8)); return new SecretKeySpec(bytes, "HmacSHA256"); } /** * 获得当前登录用户ID */ public static Long getUserId() { SecurityUserInfo userInfo = getUserInfo(); return userInfo.getUser_id(); } /** * 获得当前登录 Token */ public static String getToken() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); return Convert.toStr(authentication.getDetails()); } /** * 获得当前登录用户基础信息 * 此处的用户信息是根据 Token 解析出来的,因此无法实时更新,仅能用于获取一些基本信息 (以下是完整信息,实际信息见 SecurityUserInfo) * {"id":1,"user_id":1,"username":"admin","phone":"13670511519","phone_area_code":"86","nickname":"超人","email":"admin@qq.com","gender":1,"avatar":"/uploads/20240430/20240430143807.png","last_login_ip":"0:0:0:0:0:0:0:1","last_login_uuid":"5b34e58d-c884-4b43-9ce1-1c85b1136dcb","last_login_time":"2024-10-25 17:26:55","is_super":1,"point_balance":9870,"status":1,"audit_status":2,"audit_note":"同意通过备注","create_time":1689734700000,"update_time":1729848415000,"del_flag":-1,"roles":[{"id":1,"role_name":"管理员"}],"token_expiration":1729934998492} */ public static SecurityUserInfo getUserInfo(){ Claims tokenInfo = Jwts.parser().verifyWith(getSignInKey()).build().parseSignedClaims(getToken()).getPayload(); JSONObject userInfo = JSONUtil.parseObj(tokenInfo.get("userInfo")); String target = Convert.toStr(tokenInfo.get("target")); SecurityUserInfo securityUserInfo = JSONUtil.toBean(userInfo, SecurityUserInfo.class); securityUserInfo.setTarget(target); return securityUserInfo; } public static Object getPrincipal() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Object principal = authentication.getPrincipal(); return principal; } }