package com.xiaopeng.common.security.service; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import com.xiaopeng.api.model.operation.XpOfficialPartner; import com.xiaopeng.api.vo.account.LoginOfficialPartnerUser; import com.xiaopeng.api.vo.account.LoginOperationUser; import com.xiaopeng.common.core.exception.auth.NotLoginException; import com.xiaopeng.api.vo.account.LoginUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.xiaopeng.common.core.constant.CacheConstants; import com.xiaopeng.common.core.constant.SecurityConstants; import com.xiaopeng.common.core.utils.JwtUtils; import com.xiaopeng.common.core.utils.ServletUtils; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.core.utils.ip.IpUtils; import com.xiaopeng.common.core.utils.uuid.IdUtils; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.common.security.config.TokenProperties; import com.xiaopeng.common.security.utils.SecurityUtils; import io.jsonwebtoken.Claims; /** * token验证处理 * * @author ruoyi */ @Component public class TokenService { @Autowired private RedisService redisService; @Autowired private TokenProperties tokenProperties; protected static final long MILLIS_SECOND = 1000; protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; private final static String ACCESS_TOKEN = CacheConstants.LOGIN_TOKEN_KEY; /** * 创建令牌 */ public Map createToken(LoginUser loginUser) { String token = IdUtils.fastUUID(); Long userId = loginUser.getSysUser().getId(); String userName = loginUser.getSysUser().getUserAccount(); loginUser.setToken(token); loginUser.setUserid(userId); loginUser.setUsername(userName); loginUser.setIpaddr(IpUtils.getIpAddr()); refreshToken(loginUser); // Jwt存储信息 Map claimsMap = new HashMap(); claimsMap.put(SecurityConstants.USER_KEY, token); claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); claimsMap.put(SecurityConstants.USER_TYPE, "system"); claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); claimsMap.put(SecurityConstants.DESENSITIZATION, loginUser.getPhoneDesensitizationExempt()); // 接口返回信息 Map rspMap = new HashMap(); rspMap.put("access_token", JwtUtils.createToken(claimsMap)); rspMap.put("expires_in", tokenProperties.getExpiration()); return rspMap; } /** * 运维人员创建令牌 * @param userInfo * @return */ public Map createOperationUserToken(LoginOperationUser userInfo) { String token = IdUtils.fastUUID(); Long userId = userInfo.getXpOperationsUser().getId(); String userName = userInfo.getXpOperationsUser().getPhoneNumber(); userInfo.setToken(token); userInfo.setId(userId); userInfo.setUsername(userName); userInfo.setIpaddr(IpUtils.getIpAddr()); refreshTokenOperationUser(userInfo); // Jwt存储信息 Map claimsMap = new HashMap(); claimsMap.put(SecurityConstants.OPERATION_USER_KEY, token); claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); claimsMap.put(SecurityConstants.USER_TYPE, "operation"); claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); // 接口返回信息 Map rspMap = new HashMap(); rspMap.put("access_token", JwtUtils.createToken(claimsMap)); rspMap.put("expires_in", tokenProperties.getExpiration()); return rspMap; } /** * 合作商创建令牌 * @param userInfo * @return */ public Map createOfficialPartnerToken(LoginOfficialPartnerUser userInfo) { String token = IdUtils.fastUUID(); Integer userId = userInfo.getXpOfficialPartner().getId(); String userName = userInfo.getXpOfficialPartner().getUserName(); userInfo.setToken(token); userInfo.setId(userId); userInfo.setUsername(userName); userInfo.setIpaddr(IpUtils.getIpAddr()); refreshTokenOfficialPartner(userInfo); // Jwt存储信息 Map claimsMap = new HashMap(); claimsMap.put(SecurityConstants.OPERATION_USER_KEY, token); claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); claimsMap.put(SecurityConstants.USER_TYPE, "officialPartner"); claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); // 接口返回信息 Map rspMap = new HashMap(); rspMap.put("access_token", JwtUtils.createToken(claimsMap)); rspMap.put("expires_in", tokenProperties.getExpiration()); return rspMap; } /** * 获取用户身份信息 * * @return 用户信息 */ public LoginUser getLoginUser() { LoginUser loginUser = getLoginUser(ServletUtils.getRequest()); if (loginUser == null) { throw new NotLoginException("令牌已过期,请重新登录!"); } return loginUser; } /** * 获取运维人员登录信息 * * @return 用户信息 */ public LoginOperationUser getLoginOperationUser() { LoginOperationUser loginUser = getLoginOperationUser(ServletUtils.getRequest()); if (loginUser == null) { throw new NotLoginException("令牌已过期,请重新登录!"); } return loginUser; } /** * 获取合作商信息 * * @return 用户信息 */ public XpOfficialPartner getOfficialPartner() { XpOfficialPartner loginUser = getOfficialPartner(ServletUtils.getRequest()); if (loginUser == null) { throw new NotLoginException("令牌已过期,请重新登录!"); } return loginUser; } /** * 获取用户身份信息 * * @return 用户信息 */ public LoginUser getLoginUser(HttpServletRequest request) { // 获取请求携带的令牌 String token = SecurityUtils.getToken(request); return getLoginUser(token); } /** * 获取用户身份信息 * * @return 用户信息 */ public LoginOperationUser getLoginOperationUser(HttpServletRequest request) { // 获取请求携带的令牌 String token = SecurityUtils.getToken(request); return getLoginOperationUser(token); } /** * 获取用户身份信息 * * @return 用户信息 */ public XpOfficialPartner getOfficialPartner(HttpServletRequest request) { // 获取请求携带的令牌 String token = SecurityUtils.getToken(request); return getOfficialPartner(token); } /** * 获取用户身份信息 * * @return 用户信息 */ public LoginUser getLoginUser(String token) { LoginUser user = null; try { if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getUserKey(token); user = redisService.getCacheObject(getTokenKey(userkey)); return user; } } catch (Exception e) { } return user; } /** * 获取运维用户身份信息 * * @return 用户信息 */ public LoginOperationUser getLoginOperationUser(String token) { LoginOperationUser user = null; try { if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getOperationUserKey(token); user = redisService.getCacheObject(getTokenKey(userkey)); return user; } } catch (Exception e) { } return user; } /** * 获取运维用户身份信息 * * @return 用户信息 */ public XpOfficialPartner getOfficialPartner(String token) { XpOfficialPartner user = null; try { if (StringUtils.isNotEmpty(token)) { String userkey = JwtUtils.getOperationUserKey(token); user = redisService.getCacheObject(getTokenKey(userkey)); return user; } } catch (Exception e) { } return user; } /** * 设置用户身份信息 */ public void setLoginUser(LoginUser loginUser) { if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { refreshToken(loginUser); } } /** * 删除用户缓存信息 */ public void delLoginUser(String token) { if (StringUtils.isNotEmpty(token)) { Claims claims = JwtUtils.parseToken(token); String userType = JwtUtils.getUserType(claims); String userKey = "system".equals(userType) ? JwtUtils.getUserKey(claims) : JwtUtils.getOperationUserKey(claims); if (StringUtils.isNotBlank(userKey)) { redisService.deleteObject(getTokenKey(userKey)); } } } /** * 验证令牌有效期,相差不足120分钟,自动刷新缓存 * * @param loginUser */ public void verifyToken(LoginUser loginUser) { long expireTime = loginUser.getExpireTime(); long currentTime = System.currentTimeMillis(); if (expireTime - currentTime <= tokenProperties.getRefreshTime() * MILLIS_MINUTE) { refreshToken(loginUser); } } /** * 验证令牌有效期,相差不足120分钟,自动刷新缓存 * * @param loginOperationUser */ public void verifyToken(LoginOperationUser loginOperationUser) { long expireTime = loginOperationUser.getExpireTime(); long currentTime = System.currentTimeMillis(); if (expireTime - currentTime <= tokenProperties.getRefreshTime() * MILLIS_MINUTE) { refreshTokenOperationUser(loginOperationUser); } } /** * 刷新令牌有效期 * * @param loginUser 登录信息 */ public void refreshToken(LoginUser loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + tokenProperties.getExpiration() * MILLIS_MINUTE); // 根据uuid将loginUser缓存 String tokenKey = getTokenKey(loginUser.getToken()); redisService.setCacheObject(tokenKey, loginUser, tokenProperties.getExpiration(), TimeUnit.MINUTES); } /** * 刷新运维APP端令牌有效期 * * @param loginUser 登录信息 */ public void refreshTokenOperationUser(LoginOperationUser loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + tokenProperties.getExpiration() * MILLIS_MINUTE); // 根据uuid将loginUser缓存 String tokenKey = getTokenKey(loginUser.getToken()); redisService.setCacheObject(tokenKey, loginUser, tokenProperties.getExpiration(), TimeUnit.MINUTES); } /** * 刷新运维APP端令牌有效期 * * @param loginUser 登录信息 */ public void refreshTokenOfficialPartner(LoginOfficialPartnerUser loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + tokenProperties.getExpiration() * MILLIS_MINUTE); // 根据uuid将loginUser缓存 String tokenKey = getTokenKey(loginUser.getToken()); redisService.setCacheObject(tokenKey, loginUser, tokenProperties.getExpiration(), TimeUnit.MINUTES); } private String getTokenKey(String token) { return ACCESS_TOKEN + token; } private String getUserKey(Long userid) { return ACCESS_TOKEN + userid; } }