package cn.com.do1.component.gaiaportal.util;
import cn.com.do1.component.dsfcommon.exception.RestException;
import cn.com.do1.component.dsfredis.RedisKeys;
import cn.com.do1.component.gaiaauthorization.common.utils.TokenGenerator;
import cn.com.do1.component.gaiaauthorization.model.entity.DsfRoleEntity;
import cn.com.do1.component.gaiaauthorization.model.entity.DsfUserEntity;
import cn.com.do1.component.gaiaauthorization.model.form.AllPermissForm;
import cn.com.do1.component.gaiaportal.model.vo.login.UserInfoVo;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
/**
* 移动端登录管理
*
* @author Mark
*/
@Slf4j
@Component
public class YddUserTokenUtils {
private static final int SUPER_ADMIN_TYPE = 1;
/**
* 过期时间(单位:秒)
*/
@Value("${do1.cloud.ydd.token.expire:7200}")
public long expire;
@Autowired
StringRedisTemplate redisTemplate;
/**
* 创建请求Token
* 临时token
* @return
*/
public String createRequestToken(UserInfoVo userInfoVo){
String token = TokenGenerator.generateValue();
userInfoVo.setToken(token);
AllPermissForm tempUserForm = new AllPermissForm();
tempUserForm.setUserid(0L);
tempUserForm.setUsername("TempUser");
tempUserForm.setDeptid(0L);
tempUserForm.setPersonname("系统临时用户");
DsfRoleEntity role = new DsfRoleEntity();
role.setType(SUPER_ADMIN_TYPE);
// 构造临时用户
DsfUserEntity temporaryUser = new DsfUserEntity();
temporaryUser.setUserId(0L);
temporaryUser.setStatus("1");
temporaryUser.setUserName("TempUser");
String key = RedisKeys.getUserKey(temporaryUser.getUserId().toString());
Gson gson = new Gson();
String user = gson.toJson(temporaryUser, DsfUserEntity.class);
redisTemplate.opsForValue().set(key, user);
tempUserForm.setDsfRoleEntityList(new ArrayList<>(Arrays.asList(role)));
redisTemplate.opsForValue().set(RedisKeys.getTokenKey(token),JSONObject.fromObject(tempUserForm).toString(),expire, TimeUnit.SECONDS);
redisTemplate.opsForValue().set("do1:ydd:user"+token,JSONObject.fromObject(userInfoVo).toString(),expire, TimeUnit.SECONDS);
return token;
}
/**
* 从redis中获取移动端登录对象
* @param token token key
* @return
*/
public UserInfoVo getYddUserInfo(String token){
String userStr = redisTemplate.opsForValue().get("do1:ydd:user"+token);
Gson gson = new Gson();
UserInfoVo userInfoVo = gson.fromJson(userStr,UserInfoVo.class);
return userInfoVo;
}
/**
* 从redis中获取移动端登录对象
* @param request http 请求对象
* @return
*/
public UserInfoVo getYddUserInfoFromRequest(HttpServletRequest request){
String token = request.getHeader("X-Auth0-Token");
UserInfoVo userInfoVo = getYddUserInfo(token);
if (userInfoVo == null){
throw new RestException(40001,"Token无效");
}
return userInfoVo;
}
}