import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rdss.common.constants.CommonConstants;
import com.rdss.common.constants.SecurityConstants;
import com.rdss.common.constants.UserConstants;
import com.rdss.common.enums.UserTypeEnum;
import com.rdss.common.vo.SysRoleVo;
import com.rdss.common.vo.SysUserVo;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class UserUtil {
public static String getToken(HttpServletRequest request){
String token = "";
String authorization = request.getHeader(SecurityConstants.TOKEN_HEADER);
if(authorization != null){
token = authorization.split(" ")[1];
}
if(request.getParameter("access_token")!=null){
token = request.getParameter("access_token");
}
log.info("获取token成功,值为{}", token);
return token;
}
public static String getToken_v2(HttpServletRequest request){
String token = "";
String authorization = request.getHeader("token");
if(authorization != null){
token = authorization;
}
if(request.getParameter("token")!=null){
token = request.getParameter(token);
}
log.info("获取综合系统token成功,值为{}", token);
return token;
}
public static String getTicket(HttpServletRequest request){
String ticket = "";
String authorization = request.getHeader(SecurityConstants.TICKET_HEADER);
if(authorization != null){
ticket = authorization;
}
if(request.getParameter(SecurityConstants.TICKET_HEADER)!=null){
ticket = request.getParameter(SecurityConstants.TICKET_HEADER);
}
log.info("获取ticket成功,值为{}", ticket);
return ticket;
}
public static Claims getClaims(String token,String signKey) {
String key = Base64.getEncoder().encodeToString(signKey.getBytes());
Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
return claims;
}
public static Integer getUserId_v1(HttpServletRequest request,String signKey){
String token = getToken(request);
if(token == null){
return null;
}
Claims claims = getClaims(token, signKey);
Integer userId = (Integer) claims.get(UserConstants.USER_ID);
log.info("获取userId成功,值为{}", userId);
return userId;
}
public static Integer getUserId(HttpServletRequest request,String signKey){
SysUserVo sysUserVo = getUserByRequest(request);
if(null == sysUserVo) {
return null;
}
log.info("获取userId成功,值为{}", sysUserVo.getId());
return sysUserVo.getId();
}
public static Integer getUserOrganId_v1(HttpServletRequest request,String signKey){
String token = getToken(request);
if(token == null){
return null;
}
Claims claims = getClaims(token, signKey);
Integer organId = (Integer) claims.get(UserConstants.USER_ORGAN);
log.info("获取user机构Id成功,值为{}", organId);
return organId;
}
public static Integer getUserOrganId(HttpServletRequest request,String signKey){
SysUserVo sysUserVo = getUserByRequest(request);
if(null == sysUserVo) {
return null;
}
log.info("获取user机构Id成功,值为{}", sysUserVo.getOrganId());
return sysUserVo.getOrganId();
}
public static Integer getUserType_v1(HttpServletRequest request,String signKey){
String token = getToken(request);
if(token == null){
return null;
}
Claims claims = getClaims(token, signKey);
Integer userType = (Integer) claims.get(UserConstants.USER_TYPE);
log.info("获取userType成功,值为{}", userType);
return userType;
}
public static Integer getUserType(HttpServletRequest request,String signKey){
return UserTypeEnum.SYS_USER.getCode();
}
public static String getUserName_v1(HttpServletRequest request,String signKey){
String token = getToken(request);
if(StringUtils.isBlank(token)){
return null;
}
Claims claims = getClaims(token, signKey);
String username = (String) claims.get(UserConstants.USER_NAME);
log.info("获取username成功,值为{}", username);
return username;
}
public static String getUserName(HttpServletRequest request,String signKey){
SysUserVo sysUserVo = getUserByRequest(request);
if(null == sysUserVo) {
return null;
}
log.info("获取username成功,值为{}", sysUserVo.getUsername());
return sysUserVo.getUsername();
}
public static List<String> getRoleCodes_v1(HttpServletRequest request, String signKey) {
String token = getToken(request);
if(token == null){
return null;
}
Claims claims = getClaims(token, signKey);
List<String> roles = (List<String>) claims.get(UserConstants.AUTHORITIES);
return roles;
}
public static List<String> getRoleCodes(HttpServletRequest request, String signKey) {
SysUserVo sysUserVo = getUserByRequest(request);
if(null == sysUserVo) {
return null;
}
List<String> roles = sysUserVo.getSysRoleVoList().stream().map(SysRoleVo::getCode).collect(Collectors.toList());
log.info("获取roleCodes成功,值为{}", JSON.toJSONString(roles));
return roles;
}
public static List<SysRoleVo> getRoles_v1(HttpServletRequest request, String signKey) {
String token = getToken(request);
if(token == null){
return null;
}
Claims claims = getClaims(token, signKey);
List<SysRoleVo> roles = null;
String strRoles = (String) claims.get(UserConstants.USER_ROLES);
if(StringUtils1.isNotNull(strRoles)){
roles = new ArrayList<>();
SysRoleVo role = null;
JSONArray lstRoles = JSONUtil.parseArray(strRoles);
for(int i=0;i<lstRoles.size();i++){
role = JSONUtil.toBean(JSONUtil.toJsonStr(lstRoles.get(i)),SysRoleVo.class);
roles.add(role);
}
}
return roles;
}
public static List<SysRoleVo> getRoles(HttpServletRequest request, String signKey) {
SysUserVo sysUserVo = getUserByRequest(request);
if(null == sysUserVo) {
return null;
}
log.info("获取roles成功,值为{}", JSON.toJSONString(sysUserVo.getSysRoleVoList()));
return sysUserVo.getSysRoleVoList();
}
public static SysUserVo getUserByRequest(HttpServletRequest request){
String ticket = getTicket(request);
String token = getToken_v2(request);
if(StringUtils.isBlank(ticket) && StringUtils.isBlank(token)){
return null;
}
SysUserVo sysUserVo = null;
if(StringUtils.isNotBlank(ticket)) {
sysUserVo = getUserByTicket(ticket);
}
if(StringUtils.isNotBlank(token)) {
sysUserVo = getUserByToken(token);
}
return sysUserVo;
}
public static SysUserVo getUserByTicket(String ticket) {
StringRedisTemplate stringRedisTemplate = ApplicationContextUtil.getBean(StringRedisTemplate.class);
String userVoStr = stringRedisTemplate.opsForValue().get(CommonConstants.PREFIX_TICKET + ticket);
if(StringUtils.isNotBlank(userVoStr)) {
return JSONObject.parseObject(userVoStr, SysUserVo.class);
}
return null;
}
public static SysUserVo getUserByToken(String token) {
StringRedisTemplate stringRedisTemplate = ApplicationContextUtil.getBean(StringRedisTemplate.class);
String userVoStr = stringRedisTemplate.opsForValue().get(CommonConstants.PREFIX_TOKEN + token);
if(StringUtils.isNotBlank(userVoStr)) {
return JSONObject.parseObject(userVoStr, SysUserVo.class);
}
return null;
}
}