feat: 新增 CurrentUserUtil 工具类,用于获取和绑定当前用户信息

- 添加 CurrentUserUtil 类,实现获取当前用户信息的功能
- 提供获取用户 ID、用户名、真实姓名、部门和角色的方法- 实现绑定临时用户和清理当前线程用户信息的方法
- 用于解决在多线程环境下正确获取当前用户信息的问题
This commit is contained in:
2024-10-12 15:22:54 +08:00
parent 3766cfe8ab
commit 7a06e8d99e
@@ -0,0 +1,125 @@
package com.jero.modules.activiti.util;
import com.jero.common.system.vo.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.UnavailableSecurityManagerException;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ThreadContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: liao
* @Date: 2023/10/26 16:55
* @Description: 当前用户工具类
*/
@Slf4j
@Component
public class CurrentUserUtil {
@Autowired
private SecurityManager securityManager;
/**
* @Author: liao
* @Date: 2023/10/26 16:58
* @Description: 获取当前用户id
**/
public static String getId() {
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
return loginUser.getId();
}
/**
* @Author: liao
* @Date: 2023/10/26 16:58
* @Description: 获取当前用户名
**/
public static String getUsername() {
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
return loginUser.getUsername();
}
/**
* @Author: liao
* @Date: 2023/10/30 9:49
* @Description: 获取真实姓名
**/
public static String getRealName() {
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
return loginUser.getRealname();
}
/**
* @Author: liao
* @Date: 2023/10/30 9:50
* @Description: 姓名+工号
**/
public static String getName() {
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
return loginUser.getRealname() + "" + loginUser.getUsername() + "";
}
/**
* @Author: liao
* @Date: 2023/10/26 18:26
* @Description: 获取当前用户部门
**/
public static String getOrgCode() {
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
return loginUser.getOrgCode();
}
/**
* @Author: liao
* @Date: 2023/10/27 10:21
* @Description: 获取当前用户角色编码(逗号分隔)
**/
public static String getRoles() {
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
return loginUser.getRoleIds();
}
/**
* 获取当前用户
* @return
*/
public static LoginUser getLoginUser() {
try {
return (LoginUser) SecurityUtils.getSubject().getPrincipal();
} catch (UnavailableSecurityManagerException e) {
log.warn("未找到当前登录人");
return null;
}
}
/**
* 为当前线程绑定一个临时用户
*/
public void bindUserToThread(LoginUser tempUser) {
// 设置安全管理器
SecurityUtils.setSecurityManager(securityManager);
// 使用 SecurityManager 和用户信息构建 Subject
Subject.Builder builder = new Subject.Builder(SecurityUtils.getSecurityManager());
PrincipalCollection principalCollection = new SimplePrincipalCollection(tempUser, "yourRealmName");
builder.principals(principalCollection);
Subject subject = builder.buildSubject();
// 绑定 Subject 到当前线程
ThreadContext.bind(subject);
}
/**
* 清理当前线程中的用户信息
*/
public void clearCurrentUser() {
// 解绑当前线程的 Subject
ThreadContext.unbindSubject();
}
}