OAuth2Service.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package cn.cslg.pas.service;
  2. import cn.cslg.pas.common.core.base.Constants;
  3. import cn.cslg.pas.common.core.base.RedisConf;
  4. import cn.cslg.pas.common.model.PersonnelVO;
  5. import cn.cslg.pas.common.model.dto.PasUserDTO;
  6. import cn.cslg.pas.common.utils.*;
  7. import cn.cslg.pas.common.utils.SecurityUtils.LoginUtils;
  8. import cn.cslg.pas.domain.Project;
  9. import cn.cslg.pas.domain.ProjectUser;
  10. import cn.cslg.pas.domain.User;
  11. import cn.dev33.satoken.stp.StpUtil;
  12. import cn.hutool.captcha.CaptchaUtil;
  13. import cn.hutool.captcha.CircleCaptcha;
  14. import cn.hutool.core.img.ImgUtil;
  15. import cn.hutool.core.lang.UUID;
  16. import cn.hutool.crypto.SecureUtil;
  17. import com.alibaba.fastjson.JSONObject;
  18. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  19. import com.google.gson.Gson;
  20. import lombok.RequiredArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import okhttp3.MediaType;
  23. import okhttp3.OkHttpClient;
  24. import okhttp3.Request;
  25. import okhttp3.RequestBody;
  26. import org.springframework.beans.factory.annotation.Value;
  27. import org.springframework.context.annotation.Lazy;
  28. import org.springframework.stereotype.Service;
  29. import javax.servlet.http.HttpServletRequest;
  30. import javax.servlet.http.HttpServletResponse;
  31. import java.io.IOException;
  32. import java.util.*;
  33. import java.util.concurrent.TimeUnit;
  34. import java.util.stream.Collectors;
  35. @Service
  36. @Slf4j
  37. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  38. public class OAuth2Service {
  39. private final UserService userService;
  40. private final CacheUtils cacheUtils;
  41. private final RedisUtil redisUtil;
  42. private final ProjectUserService projectUserService;
  43. private final ProjectService projectService;
  44. private final LoginUtils loginUtils;
  45. private final RequestService requestService;
  46. @Value("${authorUrl}")
  47. private String url;
  48. public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
  49. public PersonnelVO getUserinfo() {
  50. Integer userId = loginUtils.getId();
  51. PersonnelVO personnelVO = cacheUtils.getLoginUser(userId);
  52. personnelVO.setPassword(null);
  53. return personnelVO;
  54. }
  55. public Map<Integer, Integer> getPermissions() {
  56. log.info("开始获得权限");
  57. Map<Integer, Integer> result = new HashMap<>();
  58. PersonnelVO user = this.getUserinfo();
  59. log.info("获得用户信息"+user.getName()+user.getId());
  60. if (user.getUsername().equals(Constants.ADMIN_USERNAME)) {
  61. List<Project> projectList = projectService.list();
  62. for (Project project : projectList) {
  63. result.put(project.getId(), 0);
  64. }
  65. return result;
  66. }
  67. log.info("开始查询专题库信息");
  68. List<ProjectUser> projectUserList = projectUserService.getProjectUserByUserId(user.getId());
  69. log.info("查询专题库信息");
  70. List<Project> projectList = projectService.getProjectByIds(projectUserList.stream().map(ProjectUser::getProjectId).collect(Collectors.toList()));
  71. List<Project> createProject = projectService.getProjectByCreateId(user.getId());
  72. List<Project> projects = new ArrayList<>();
  73. Set<Integer> projectIds = new HashSet<>();
  74. projects.addAll(projectList);
  75. projects.addAll(createProject);
  76. projects.forEach(item -> projectIds.add(item.getId()));
  77. for (Integer projectId : projectIds) {
  78. Integer userType;
  79. Project project = projects.stream().filter(item -> item.getId().equals(projectId)).findFirst().orElse(new Project());
  80. if (project.getCreateBy().equals(user.getId())) {
  81. userType = 0;
  82. } else {
  83. ProjectUser projectUser = projectUserList.stream().filter(item -> item.getProjectId().equals(projectId)).findFirst().orElse(new ProjectUser());
  84. userType = projectUser.getType();
  85. }
  86. result.put(projectId, userType);
  87. }
  88. return result;
  89. }
  90. public String getTokenByUsername(String username, String password, String code, String uuid) {
  91. String tempCode = redisUtil.get(RedisConf.VERIFY_CODE + RedisConf.SYMBOL_COLON + uuid);
  92. if (StringUtils.isEmpty(tempCode) || !tempCode.equals(code)) {
  93. return Response.error(ResponseEnum.VERIFY_CODE_ERROR);
  94. }
  95. User user = userService.getByUsername(username);
  96. if (user == null) {
  97. return Response.error(ResponseEnum.USERNAME_ERROR);
  98. }
  99. boolean isPassword = SecureUtil.md5(password).equals(user.getPassword());
  100. if (!isPassword) {
  101. return Response.error(ResponseEnum.PASSWORD_ERROR);
  102. }
  103. StpUtil.login(user.getId());
  104. cacheUtils.setLoginUser(user);
  105. user.setPassword(null);
  106. return Response.success(user);
  107. }
  108. public String getVerifyCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
  109. //定义图形验证码的长、宽、验证码字符数、干扰元素个数
  110. CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
  111. String uuid = UUID.fastUUID().toString();
  112. Map<String, String> result = new HashMap<>();
  113. result.put("captcha", ImgUtil.toBase64DataUri(captcha.getImage(), "png"));
  114. result.put("uuid", uuid);
  115. redisUtil.setEx(RedisConf.VERIFY_CODE + RedisConf.SYMBOL_COLON + uuid, captcha.getCode(), 60, TimeUnit.SECONDS);
  116. return Response.success(result);
  117. }
  118. /**
  119. * @return 1.生成验证码的base64转码 2.生成的UUID 与Redis里面的验证码KEY值一致
  120. * @author 沈永艺
  121. */
  122. public String verifyCode() throws Exception {
  123. String resBody = requestService.getVerifyCodeFromPCS();
  124. JSONObject jsonObject = JSONObject.parseObject(resBody);
  125. JSONObject data = (JSONObject) jsonObject.get("data");
  126. Object captcha = data.get("captcha");
  127. Object uuid = data.get("uuid");
  128. Map<String, String> result = new HashMap<>();
  129. result.put("captcha", captcha.toString());
  130. result.put("uuid", uuid.toString());
  131. return Response.success(result);
  132. }
  133. /**
  134. * @return 登录成功的信息
  135. * @author 沈永艺
  136. */
  137. public String login(String username, String password, String code, String uuid) throws IOException {
  138. String resBody = requestService.LoginFromPCS(username, password, code, uuid);
  139. JSONObject jsonObject = JSONObject.parseObject(resBody);
  140. //判断请求返回是否为200,不是的话则返回报错信息
  141. if (!jsonObject.get("code").equals(200)) {
  142. return Response.error(jsonObject.get("message").toString());
  143. }
  144. String token = jsonObject.get("data").toString();
  145. PersonnelVO personnelVO = com.alibaba.fastjson2.JSONObject.parseObject(token, PersonnelVO.class);
  146. token = personnelVO.getToken();
  147. String q = "token:login:token:" + token;
  148. String IdS = redisUtil.get(q);
  149. PersonnelVO personnelVO2 = cacheUtils.getLoginUser(IdS);
  150. String tenantType = personnelVO2.getTenantType();
  151. HashMap<Object, Object> loginMap = new HashMap<>();
  152. loginMap.put("token", token);
  153. loginMap.put("tenantType", tenantType);
  154. return Response.success(loginMap);
  155. }
  156. public String changePwd(String oldPassword, String newPassword) {
  157. Integer userId = loginUtils.getId();
  158. User user = userService.getById(userId);
  159. boolean isPassword = SecureUtil.md5(oldPassword).equals(user.getPassword());
  160. if (!isPassword) {
  161. return Response.error("旧密码错误");
  162. }
  163. user.setPassword(SecureUtil.md5(newPassword));
  164. user.updateById();
  165. return Response.success(true);
  166. }
  167. /**
  168. * @title 获得专题库成员列表
  169. * @description 获得专题库成员列表
  170. * @autor lrj
  171. */
  172. public String getPASAssignedUser(PasUserDTO params) throws IOException {
  173. OkHttpClient okHttpClient = new OkHttpClient();
  174. String param = new Gson().toJson(params);
  175. RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
  176. Request request = new Request.Builder()
  177. .url(url + "/permission/api/system/getPASAssignedUser")
  178. .post(requestBody)
  179. .build();
  180. return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
  181. }
  182. }