UserServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. package com.huaxu.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.huaxu.dao.LoginLogMapper;
  5. import com.huaxu.dao.UserMapper;
  6. import com.huaxu.dto.UserAuthDto;
  7. import com.huaxu.dto.UserDto;
  8. import com.huaxu.entity.LoginLog;
  9. import com.huaxu.entity.MenuEntity;
  10. import com.huaxu.entity.Org;
  11. import com.huaxu.entity.User;
  12. import com.huaxu.exception.ServiceException;
  13. import com.huaxu.model.LoginUser;
  14. import com.huaxu.model.Permission;
  15. import com.huaxu.model.ProgramItem;
  16. import com.huaxu.model.ResultStatus;
  17. import com.huaxu.security.mobile.MobileLoginAuthenticationToken;
  18. import com.huaxu.service.UserService;
  19. import com.huaxu.util.*;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.apache.commons.lang3.StringUtils;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.http.HttpEntity;
  25. import org.springframework.http.HttpHeaders;
  26. import org.springframework.http.HttpStatus;
  27. import org.springframework.http.ResponseEntity;
  28. import org.springframework.security.core.GrantedAuthority;
  29. import org.springframework.security.core.context.SecurityContextHolder;
  30. import org.springframework.security.oauth2.common.OAuth2AccessToken;
  31. import org.springframework.security.oauth2.provider.ClientDetailsService;
  32. import org.springframework.security.oauth2.provider.OAuth2Authentication;
  33. import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
  34. import org.springframework.security.oauth2.provider.token.ConsumerTokenServices;
  35. import org.springframework.security.oauth2.provider.token.TokenStore;
  36. import org.springframework.stereotype.Service;
  37. import org.springframework.util.LinkedMultiValueMap;
  38. import org.springframework.util.MultiValueMap;
  39. import org.springframework.web.client.RestTemplate;
  40. import sun.misc.BASE64Encoder;
  41. import javax.servlet.http.HttpServletRequest;
  42. import java.util.*;
  43. import java.util.stream.Collectors;
  44. /**
  45. * 用户(User表)服务实现类
  46. *
  47. * @author makejava
  48. * @since 2020-10-21 15:23:52
  49. */
  50. @Service("userService")
  51. @Slf4j
  52. public class UserServiceImpl implements UserService {
  53. @Autowired
  54. private UserMapper userMapper;
  55. @Autowired
  56. private ConsumerTokenServices consumerTokenServices;
  57. @Autowired
  58. private RedisUtil redisUtil;
  59. @Autowired
  60. private HttpServletRequest request;
  61. @Autowired
  62. private ClientDetailsService clientDetailsService;
  63. @Autowired
  64. private AuthorizationServerTokenServices authorizationServerTokenServices;
  65. @Autowired
  66. private LoginLogMapper loginLogMapper;
  67. @Autowired
  68. private TokenStore tokenStore;
  69. @Value("${iot.url}")
  70. private String iotUrl;
  71. /**
  72. * 通过ID查询单条数据
  73. *
  74. * @param id 主键
  75. * @return 实例对象
  76. */
  77. @Override
  78. public User selectById(Integer id) {
  79. return this.userMapper.selectById(id);
  80. }
  81. /**
  82. * 查询所有
  83. *
  84. * @return 实例对象的集合
  85. */
  86. @Override
  87. public List<User> selectAll() {
  88. return this.userMapper.selectAll();
  89. }
  90. /**
  91. * 根据条件查询
  92. *
  93. * @return 实例对象的集合
  94. */
  95. @Override
  96. public List<User> selectList(User user) {
  97. return this.userMapper.selectList(user);
  98. }
  99. /**
  100. * 新增数据
  101. *
  102. * @param user 实例对象
  103. * @return 实例对象
  104. */
  105. @Override
  106. public int insert(User user) {
  107. return this.userMapper.insert(user);
  108. }
  109. /**
  110. * 批量新增
  111. *
  112. * @param users 实例对象的集合
  113. * @return 生效的条数
  114. */
  115. @Override
  116. public int batchInsert(List<User> users) {
  117. return this.userMapper.batchInsert(users);
  118. }
  119. /**
  120. * 修改数据
  121. *
  122. * @param user 实例对象
  123. * @return 实例对象
  124. */
  125. @Override
  126. public int update(User user) {
  127. return this.userMapper.update(user);
  128. }
  129. /**
  130. * 通过主键删除数据
  131. *
  132. * @param id 主键
  133. * @return 是否成功
  134. */
  135. @Override
  136. public int deleteById(Integer id) {
  137. return this.userMapper.deleteById(id);
  138. }
  139. /**
  140. * 查询总数据数
  141. *
  142. * @return 数据总数
  143. */
  144. @Override
  145. public int count() {
  146. return this.userMapper.count();
  147. }
  148. /**
  149. * 分页查询
  150. *
  151. * @return 对象列表
  152. */
  153. @Override
  154. public IPage<User> selectPage(User user, IPage<User> page) {
  155. return this.userMapper.selectPage(page, user);
  156. }
  157. @Override
  158. public User findUser(User user) {
  159. List<User> users = userMapper.selectList(user);
  160. if(users!=null&&users.size()>0){
  161. return users.get(0);
  162. }
  163. return null;
  164. }
  165. public void offline(String clientId, Integer userId, Integer status) {
  166. Collection<OAuth2AccessToken> c = tokenStore.findTokensByClientIdAndUserName(clientId, String.valueOf(userId));
  167. System.out.println(c.size());
  168. for (OAuth2AccessToken oAuth2AccessToken : c) {
  169. String accessToken = oAuth2AccessToken.getValue();
  170. String tokenKey = "offlineStatus:" + accessToken;
  171. redisUtil.setExpire(tokenKey.getBytes(), ByteArrayUtils.objectToBytes(status).get(), 1800);//15分钟过期
  172. tokenStore.removeAccessToken(oAuth2AccessToken);
  173. }
  174. }
  175. @Override
  176. public String getRangeCode(String appId) {
  177. UserAuthDto userAuthDto = new UserAuthDto();
  178. LoginUser currentUser = UserUtil.getCurrentUser();
  179. Integer id = currentUser.getId();
  180. String appSecret=userMapper.getAppSecret(appId);
  181. String uniqueUserID=userMapper.getUniqueUserID(id);
  182. if(uniqueUserID==null){
  183. uniqueUserID=UUID.randomUUID().toString();
  184. userMapper.updateUniqueUserID(id,uniqueUserID);
  185. }
  186. Random random = new Random();
  187. String code="";
  188. if(uniqueUserID!=null){
  189. userAuthDto.setUniqId(uniqueUserID);
  190. userAuthDto.setMobile(currentUser.getPhoneNumber());
  191. for (int i=0;i<6;i++)
  192. {
  193. code+=random.nextInt(10);
  194. }
  195. String key=code+"_"+appId+"_"+appSecret;
  196. redisUtil.set(key, JSONObject.toJSONString(userAuthDto));
  197. redisUtil.setExpire(key,300);
  198. }
  199. return code;
  200. }
  201. @Override
  202. public String getUniqId(String appId, String appSecret, String code) {
  203. String key=code+"_"+appId+"_"+appSecret;
  204. return redisUtil.get(key);
  205. }
  206. @Override
  207. public UserAuthDto getUniqId(String appId, String encryptValue) {
  208. String appSecret = userMapper.getAppSecret(appId);
  209. if (StringUtils.isEmpty(appSecret)){
  210. throw new ServiceException(ResultStatus.USER_AUTH_APPID_NOT_FOUND);
  211. }
  212. String key = null;
  213. try {
  214. // 验证加密的内容是否正确
  215. key = DESUtil.decrypt(encryptValue,appSecret);
  216. // 截取里面的时间
  217. String date = key.substring(key.lastIndexOf("_") + 1, key.length());
  218. // 验证在5分钟之内是否是有效的加密
  219. if (!DESUtil.verifyTime(Long.parseLong(date), 5)){
  220. throw new ServiceException(ResultStatus.USER_AUTH_ENCRYPT_VALUE_VERIFY_ERROR);
  221. }
  222. } catch (Exception e) {
  223. throw new ServiceException(ResultStatus.USER_AUTH_ENCRYPT_VALUE_VERIFY_ERROR);
  224. }
  225. String value = redisUtil.get(key.substring(0, key.lastIndexOf("_")));
  226. if (StringUtils.isEmpty(value)){
  227. throw new ServiceException(ResultStatus.USER_AUTH_UNIQID_OR_CODE_ISNULL);
  228. }
  229. UserAuthDto dto = JSONObject.parseObject(value,UserAuthDto.class);
  230. dto.setMessage(key);
  231. return dto;
  232. }
  233. @Override
  234. public User chooseUser(User user) {
  235. LoginUser currentUser = UserUtil.getCurrentUser();
  236. if(currentUser.getTenantId()!=null){
  237. user.setPhone(currentUser.getPhoneNumber());
  238. user.setTenantId(currentUser.getTenantId());
  239. }
  240. user=findUser(user);
  241. UserDto userDto=new UserDto();
  242. userDto.setPhone(user.getPhone());
  243. List<ProgramItem>programItems=new ArrayList<>();
  244. Permission permission= findPermission(user);
  245. boolean returnFlag=false;
  246. if((permission!=null&&permission.getRoleState()==0)){
  247. user.setEnableState("0");
  248. returnFlag=true;
  249. }
  250. if((user.getTenantState()!=null&&user.getTenantState()==0)){
  251. user.setEnableState("0");
  252. returnFlag=true;
  253. }
  254. if((user.getCompanyOrgState()!=null&&user.getCompanyOrgState()==0)){
  255. user.setEnableState("0");
  256. returnFlag=true;
  257. }
  258. if((user.getDepartmentOrgState()!=null&&user.getDepartmentOrgState()==0)){
  259. user.setEnableState("0");
  260. returnFlag=true;
  261. }
  262. if("0".equals(user.getEnableState())){
  263. returnFlag=true;
  264. }
  265. if(returnFlag){
  266. return user;
  267. }
  268. offline("smart-city-v2",user.getId(),1);
  269. getDataPermission(permission.getPermissionType(),user,programItems);
  270. //角色必须是ROLE_开头,其余的是用户功能权限
  271. /*
  272. Integer permissionType = permissionList.get(0).getPermissionType();
  273. List<ProgramItem> programItemList = newArrayList();
  274. //获取数据权限
  275. //分配功能权限
  276. if (permissionList.size() > 0) {
  277. for (Permission permission : permissionList) {
  278. if(!StringUtils.equals("",permission.getPermission())){
  279. GrantedAuthority authority1 = new SimpleGrantedAuthority(permission.getPermission());
  280. grantedAuthorities.add(authority1);
  281. }
  282. }
  283. }
  284. */
  285. Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
  286. OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication();
  287. LoginUser loginUser = (LoginUser) oAuth2Authentication.getPrincipal();
  288. //放置系统级菜单对应用户appid
  289. loginUser.setAppIds(findUserFirstMenu(user.getTenantId(),user.getId(),user.getUserType()));
  290. loginUser.setProgramItemList(programItems);
  291. loginUser.setName(user.getUsername());
  292. loginUser.setId(user.getId());
  293. loginUser.setUsername(user.getUsername());
  294. loginUser.setCompanyId(user.getCompanyOrgId());
  295. loginUser.setDepartmentId(user.getDeptOrgId());
  296. loginUser.setTenantId(user.getTenantId());
  297. loginUser.setType(user.getUserType());
  298. loginUser.setPhoneNumber(user.getPhone());
  299. loginUser.setAuthorities(grantedAuthorities);
  300. loginUser.setPermissonType(permission.getPermissionType());
  301. loginUser.setRoleId(permission.getRoleId());
  302. loginUser.setLoginToken(UUID.randomUUID().toString());
  303. MobileLoginAuthenticationToken authenticationTokenReslut = new MobileLoginAuthenticationToken(loginUser,oAuth2Authentication.getCredentials(),loginUser.getAuthorities());
  304. authenticationTokenReslut.setDetails(oAuth2Authentication.getDetails());
  305. OAuth2Authentication oAuth2AuthenticationNew = new OAuth2Authentication(oAuth2Authentication.getOAuth2Request(), authenticationTokenReslut);
  306. OAuth2AccessToken accessToken = authorizationServerTokenServices.createAccessToken(oAuth2AuthenticationNew);
  307. //可以加一个映射表
  308. String iotToken=getLoginIotToken(user.getIotPhoneNumber());
  309. if(iotToken!=null){
  310. String iotTokenKey = "iotToken:" + accessToken.getValue();
  311. redisUtil.set(iotTokenKey,iotToken);
  312. redisUtil.setExpire(iotTokenKey,60*30);
  313. }
  314. insertLoginLog(loginUser,"登录");
  315. user.setToken(accessToken.getValue());
  316. return user;
  317. }
  318. public String getLoginIotToken(String account){
  319. log.info("begin IotService login account={}",account);
  320. String url = iotUrl + "/api/integration/auth/login";
  321. RestTemplate restTemplate = new RestTemplate();
  322. if(account==null){
  323. return null;
  324. }
  325. MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
  326. map.add("source","rmcp");
  327. map.add("code",new BASE64Encoder().encode(account.getBytes()));
  328. HttpHeaders headers = new HttpHeaders();
  329. HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map,headers);
  330. ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(url, request, JSONObject.class);
  331. log.info("responseEntity ={}", JSONObject.toJSONString(responseEntity));
  332. if(responseEntity !=null && responseEntity.getStatusCode() == HttpStatus.OK){
  333. JSONObject jsonObject = responseEntity.getBody();
  334. if(jsonObject != null){
  335. if(jsonObject.getInteger("status")==0){
  336. String token = jsonObject.getString("data");
  337. log.info("IotService getLoginIotToken success res={}",token);
  338. return token;
  339. }else {
  340. log.info("IotService getLoginIotToken fail");
  341. return null;
  342. }
  343. }else {
  344. return null;
  345. }
  346. }
  347. return null;
  348. }
  349. private void getDataPermission(int permissionType,User user, List<ProgramItem> programItemList){
  350. ProgramItem defaultProgramItem=new ProgramItem();
  351. defaultProgramItem.setOrgCompanyId(-999);
  352. defaultProgramItem.setOrgDeparmtmentId(-999);
  353. programItemList.add(defaultProgramItem);
  354. if(permissionType==1){
  355. ProgramItem programItem=new ProgramItem();
  356. programItem.setOrgId(user.getCompanyOrgId());
  357. programItem.setOrgCompanyId(user.getCompanyOrgId());
  358. programItemList.add(programItem);
  359. }else if(permissionType==2){
  360. Map<Integer, List<Org>> allOrgs = getAllOrgs(null,user.getTenantId());
  361. ProgramItem programItem=new ProgramItem();
  362. programItem.setOrgId(user.getCompanyOrgId());
  363. programItem.setOrgCompanyId(user.getCompanyOrgId());
  364. getOrg(user.getCompanyOrgId(),allOrgs,programItemList);
  365. programItemList.add(programItem);
  366. }else if(permissionType==3&&user.getDeptOrgId()!=null){
  367. ProgramItem programItem=new ProgramItem();
  368. programItem.setOrgId(user.getDeptOrgId());
  369. programItem.setOrgDeparmtmentId(user.getDeptOrgId());
  370. programItemList.add(programItem);
  371. }else if(permissionType==4&&user.getDeptOrgId()!=null) {
  372. ProgramItem programItem=new ProgramItem();
  373. programItem.setOrgId(user.getDeptOrgId());
  374. programItem.setOrgDeparmtmentId(user.getDeptOrgId());
  375. Map<Integer, List<Org>> allOrgs = getAllOrgs("department",user.getTenantId());
  376. getOrg(user.getDeptOrgId(),allOrgs,programItemList);
  377. programItemList.add(programItem);
  378. }else if(permissionType==5){
  379. programItemList.addAll( userMapper.findOrgRole(user));
  380. programItemList.forEach(programItem -> {
  381. if("company".equals(programItem.getNewType())){
  382. programItem.setOrgCompanyId(programItem.getOrgId());
  383. }else if("department".equals(programItem.getNewType())){
  384. programItem.setOrgDeparmtmentId(programItem.getOrgId());
  385. }
  386. programItem.setCode(user.getTenantId());
  387. });
  388. }
  389. }
  390. private Map<Integer, List<Org>> getAllOrgs(String orgType,String tenantId){
  391. Org org=new Org();
  392. org.setOrgType(orgType);
  393. org.setTenantId(tenantId);
  394. List<Org> orgs = userMapper.findOrgs(org);
  395. Map<Integer, List<Org>> collect = orgs.stream().
  396. collect(Collectors.groupingBy(d -> d.getParentOrgId()));
  397. return collect;
  398. };
  399. public void getOrg(Integer id, Map<Integer, List<Org>> collect,List<ProgramItem>programItemList){
  400. List<Org> orgs = collect.get(id);
  401. if(orgs!=null){
  402. orgs.forEach(org->{
  403. ProgramItem item=new ProgramItem();
  404. item.setOrgId(org.getId());
  405. if("company".equals(org.getOrgType())){
  406. item.setOrgCompanyId(org.getId());
  407. }else if("department".equals(org.getOrgType())){
  408. item.setOrgDeparmtmentId(org.getId());
  409. }
  410. item.setCode(org.getTenantId());
  411. programItemList.add(item);
  412. getOrg(org.getId(),collect,programItemList);
  413. });
  414. }
  415. }
  416. private Permission findPermission(User user){
  417. List<Permission> permissionList = userMapper.findPermission(user);
  418. if(permissionList.size()==0){
  419. return null;
  420. }
  421. return permissionList.get(0);
  422. }
  423. private List<String> findUserFirstMenu(String tenantId, Integer userId,String userType){
  424. List<MenuEntity> menuEntities = userMapper.findUserFirstMenu(tenantId, userId);
  425. switch (userType) {
  426. // case "1"://超级管理员查询所有系统菜单
  427. // menuEntities = menuMapper.findAllFirstMenu();
  428. // break;
  429. // case "2"://普通用户按角色查询租户菜单
  430. // menuEntities = menuMapper.findUserFirstMenu(currentUser.getTenantId(),userId);
  431. // break;
  432. case "-9999"://超级管理员查询所有系统菜单
  433. menuEntities = userMapper.findAllFirstMenu();
  434. break;
  435. case "-999"://租户管理员查询租户菜单
  436. menuEntities = userMapper.findTenantFirstMenu(tenantId);
  437. break;
  438. default: //其他租户用户暂时不区分类型
  439. menuEntities = userMapper.findUserFirstMenu(tenantId,userId);
  440. break;
  441. }
  442. List<String>appIds=new ArrayList<>();
  443. menuEntities.forEach(menuEntity -> {
  444. appIds.add(menuEntity.getAppId());
  445. });
  446. return appIds;
  447. }
  448. @Override
  449. public boolean logOut(String token) {
  450. boolean flag=consumerTokenServices.revokeToken(token);
  451. insertLoginLog(UserUtil.getCurrentUser(),"登出");
  452. return flag;
  453. }
  454. /**
  455. * 新增注册数据
  456. * @author yjy
  457. * @param user 实例对象
  458. * @return 影响行数
  459. */
  460. @Override
  461. public int insertRegister(User user) {
  462. return this.userMapper.insertRegister(user);
  463. }
  464. private void insertLoginLog(LoginUser loginUser,String type){
  465. LoginLog loginLog=new LoginLog();
  466. loginLog.setName(loginUser.getName());
  467. loginLog.setPhone(loginUser.getPhoneNumber());
  468. loginLog.setTenantId(loginUser.getTenantId());
  469. loginLog.setCompanyId(loginUser.getCompanyId());
  470. loginLog.setDepartmentId(loginUser.getDepartmentId());
  471. loginLog.setType(type);
  472. loginLog.setCreateTime(new Date());
  473. loginLog.setLoginIp(Util.getIpAddr(request));
  474. loginLogMapper.insert(loginLog);
  475. }
  476. }