| | |
| | | import com.vci.starter.web.pagemodel.RequestClientInfo; |
| | | import com.vci.starter.web.pagemodel.SessionInfo; |
| | | import com.vci.starter.web.pagemodel.TokenVO; |
| | | import com.vci.starter.web.util.ApplicationContextProvider; |
| | | import com.vci.starter.web.util.JwtUtils; |
| | | import com.vci.starter.web.util.Md5; |
| | | import com.vci.starter.web.util.VciBaseUtil; |
| | | import com.vci.starter.web.util.*; |
| | | import com.vci.web.bo.LoginResultBO; |
| | | import com.vci.web.constant.CacheNameConstant; |
| | | import com.vci.web.dto.LoginUserDTO; |
| | |
| | | } |
| | | |
| | | //需要看看是否已经登录了 |
| | | String loginKey = CacheNameConstant.cacheKey(CacheNameConstant.VCI_USER_LOGIN, userDTO.getUserId()); |
| | | if(redisService.hasKey(loginKey) && !userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()){ |
| | | String userIdTokenKey = CacheNameConstant.cacheKey(CacheNameConstant.USERID_TOKEN_KEY, userDTO.getUserId().trim()); |
| | | if(redisService.hasKey(userIdTokenKey) && !userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()){ |
| | | loginResult.setFailCode(USER_IS_LOGINED); |
| | | loginResult.setFailMsg("当前用户已经在其他地方登录!"); |
| | | return loginResult; |
| | | } |
| | | //说明已经登录了,那应该取消原来的登录 |
| | | if (redisService.hasKey(loginKey) && userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()) { |
| | | redisService.deleteObject(CacheNameConstant.VCI_USER_LOGIN); |
| | | if (redisService.hasKey(userIdTokenKey) && userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()) { |
| | | String tokenKey = redisService.getCacheObject(userIdTokenKey); |
| | | redisService.deleteObject(tokenKey); |
| | | redisService.deleteObject(userIdTokenKey); |
| | | } |
| | | |
| | | //2.获取用户的对象. |
| | |
| | | |
| | | loginResult.setSuccess(true); |
| | | sessionInfo.setToken(Md5.md5(VciBaseUtil.getPk() + "_" + user.getId())); |
| | | loginResult.setSessionInfo(sessionInfo); |
| | | |
| | | //添加到会话信息 |
| | | saveSessionInfo(sessionInfo); |
| | | TokenVO tokenVO = saveSessionInfo(sessionInfo); |
| | | loginResult.setTokenVO(tokenVO); |
| | | |
| | | return loginResult; |
| | | } |
| | |
| | | * @Return com.vci.frameworkcore.pagemodel.SmUserVO |
| | | */ |
| | | private SmUserVO getUserByUserId(String userId) { |
| | | String userKey = CacheNameConstant.cacheKey(CacheNameConstant.VCI_USER,userId); |
| | | String userOid = redisService.getCacheObject(userKey); |
| | | String oidKey = CacheNameConstant.cacheKey(CacheNameConstant.VCI_USER_OID, userOid); |
| | | SmUserVO userVO = redisService.getCacheObject(oidKey); |
| | | if(userVO == null || StringUtils.isBlank(userVO.getOid())){ |
| | | userVO = userQueryService.getUserByUserId(userId); |
| | | } |
| | | return userVO; |
| | | return userQueryService.getUserByUserId(userId); |
| | | } |
| | | |
| | | |
| | |
| | | * 保存会话信息 |
| | | * @param sessionInfo 会话信息 |
| | | */ |
| | | private void saveSessionInfo(SessionInfo sessionInfo){ |
| | | private TokenVO saveSessionInfo(SessionInfo sessionInfo){ |
| | | if(sessionForLogin == null){ |
| | | throw new VciBaseException("没有配置会话存储的服务"); |
| | | } |
| | | //将权限信息,放入redis缓存中。以防止session中的信息过多,存入数据库中出现错误 |
| | | redisService.setCacheList(sessionInfo.getToken(),sessionInfo.getFunctionOids()); |
| | | redisService.expire(sessionInfo.getToken(), 1, TimeUnit.HOURS); |
| | | |
| | | sessionInfo.setFunctionOids(new ArrayList<>()); |
| | | sessionForLogin.saveSessionInfo(sessionInfo); |
| | | return sessionForLogin.createToken(sessionInfo); |
| | | } |
| | | |
| | | /** |
| | |
| | | sessionInfo.setRtxNo(user.getRtxNo()); |
| | | sessionInfo.setIMId(user.getIMNo()); |
| | | sessionInfo.setPortalId(user.getId()); |
| | | sessionInfo.setLastLoginTime(user.getLastLoginTime()!=null?user.getLastLoginTime().getTime(): VciDateUtil.getNowTime()); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | private void updateUserForLoginSuccess(String userOid){ |
| | | userQueryService.updateUserLoginTime(userOid); |
| | | } |
| | | |
| | | /** |
| | | * 创建许可的信息 |
| | | * |
| | | * @param sessionInfo session的信息 |
| | | * @return 许可信息 |
| | | */ |
| | | @Override |
| | | public TokenVO createToken(SessionInfo sessionInfo) { |
| | | return createToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo); |
| | | } |
| | | |
| | | /** |
| | | * 创建许可的信息 |
| | | * @param key token在redis中的key |
| | | * @param sessionInfo session的信息 |
| | | * @return 许可信息 |
| | | */ |
| | | @Override |
| | | public TokenVO createToken(String key, SessionInfo sessionInfo) { |
| | | if(StringUtils.isBlank(sessionInfo.getToken())) { |
| | | String token = Md5.md5(VciBaseUtil.getPk() + "_" + sessionInfo.getUserId()); |
| | | sessionInfo.setToken(token); |
| | | } |
| | | if(StringUtils.isBlank(key)){ |
| | | key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS; |
| | | } |
| | | refreshToken(key, sessionInfo); |
| | | Map<String,Object> claimsMap = new HashMap<>(); |
| | | claimsMap.put(TokenKeyConstant.JWT_TOKEN_KEY,sessionInfo.getToken()); |
| | | claimsMap.put(TokenKeyConstant.JWT_USER_KEY,sessionInfo.getUserOid()); |
| | | claimsMap.put(TokenKeyConstant.JWT_USER_NAME_KEY,sessionInfo.getUserName()); |
| | | claimsMap.put(TokenKeyConstant.JWT_USER_CODE_KEY,sessionInfo.getUserId()); |
| | | TokenVO tokenVO = new TokenVO(); |
| | | tokenVO.setAccessToken(JwtUtils.createToken(claimsMap)); |
| | | tokenVO.setExpireTime(TokenKeyConstant.EXPIRATION); |
| | | return tokenVO; |
| | | } |
| | | |
| | | /** |
| | | * 刷新token |
| | | * @param sessionInfo session的信息 |
| | | */ |
| | | @Override |
| | | public void refreshToken(SessionInfo sessionInfo) { |
| | | refreshToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo); |
| | | } |
| | | |
| | | /** |
| | | * 刷新token |
| | | * @param key token在redis中的key |
| | | * @param sessionInfo session的信息 |
| | | */ |
| | | @Override |
| | | public void refreshToken(String key, SessionInfo sessionInfo) { |
| | | if(sessionInfo!=null && StringUtils.isNotBlank(sessionInfo.getToken())){ |
| | | if(StringUtils.isBlank(key)){ |
| | | key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS; |
| | | } |
| | | String redisKey = key + sessionInfo.getToken(); |
| | | redisService.setCacheObject(redisKey, sessionInfo, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES); |
| | | } |
| | | } |
| | | |
| | | /** |