UserExController.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package org.springblade.system.bladeuserex.controller;
  2. import io.swagger.annotations.Api;
  3. import io.swagger.annotations.ApiOperation;
  4. import io.swagger.annotations.ApiParam;
  5. import lombok.AllArgsConstructor;
  6. import lombok.extern.slf4j.Slf4j;
  7. import me.zhyd.oauth.request.AuthRequest;
  8. import me.zhyd.oauth.utils.AuthStateUtils;
  9. import org.springblade.core.log.annotation.ApiLog;
  10. import org.springblade.core.mp.support.BaseEntityWrapper;
  11. import org.springblade.core.secure.BladeUser;
  12. import org.springblade.core.tool.api.R;
  13. import org.springblade.core.tool.support.Kv;
  14. import org.springblade.core.tool.utils.Func;
  15. import org.springblade.core.tool.utils.SpringUtil;
  16. import org.springblade.core.tool.utils.WebUtil;
  17. import org.springblade.modules.auth.granter.ITokenGranter;
  18. import org.springblade.modules.auth.granter.TokenGranterBuilder;
  19. import org.springblade.modules.auth.granter.TokenParameter;
  20. import org.springblade.modules.auth.utils.TokenUtil;
  21. import org.springblade.modules.system.entity.User;
  22. import org.springblade.modules.system.entity.UserInfo;
  23. import org.springblade.modules.system.service.IParamService;
  24. import org.springblade.modules.system.service.IUserService;
  25. import org.springblade.system.bladeuserex.social.SocialTokenGranter;
  26. import org.springblade.system.bladeuserex.social.SocialUtil;
  27. import org.springblade.system.bladeuserex.vo.UserVO;
  28. import org.springblade.system.bladeuserex.wrapper.UserWrapper;
  29. import org.springblade.system.orgposition.service.IOrgPositionService;
  30. import org.springframework.data.redis.core.RedisTemplate;
  31. import org.springframework.web.bind.annotation.*;
  32. import javax.servlet.http.HttpServletRequest;
  33. import javax.servlet.http.HttpServletResponse;
  34. import java.io.IOException;
  35. import java.util.concurrent.TimeUnit;
  36. /**
  37. * Created By lidexi in 2021/3/24
  38. **/
  39. @RestController
  40. @AllArgsConstructor
  41. @RequestMapping("blade-user")
  42. @Api(value = "", tags = "接口")
  43. @Slf4j
  44. public class UserExController {
  45. private IUserService userService;
  46. private IOrgPositionService orgPositionService;
  47. private RedisTemplate<String,String> redisTemplate;
  48. private final static String LOGIN_ERROR_PREFIX = "loginerror:";
  49. private IParamService paramService;
  50. @GetMapping("/info-strength")
  51. public R<UserVO> info(BladeUser user) {
  52. User detail = this.userService.getById(user.getUserId());
  53. return R.data(UserWrapper.build(orgPositionService).entityVO(detail));
  54. }
  55. @ApiLog("登录用户验证扩展-增加登录错误阈值")
  56. @PostMapping({"/oauth/token"})
  57. @ApiOperation(
  58. value = "获取认证token",
  59. notes = "传入租户ID:tenantId,账号:account,密码:password"
  60. )
  61. public Kv token(@ApiParam(value = "租户ID",required = true) @RequestParam String tenantId, @ApiParam(value = "账号",required = true) @RequestParam(required = false) String username, @ApiParam(value = "密码",required = true) @RequestParam(required = false) String password
  62. ) {
  63. Kv authInfo = Kv.create();
  64. String loginMaxErrorTimes = paramService.getValue("login.error.times");//登录错误阈值
  65. String currentTimes = redisTemplate.opsForValue().get(LOGIN_ERROR_PREFIX + tenantId + ":" + username);
  66. if (currentTimes != null) {
  67. if (Integer.valueOf(currentTimes) > Integer.valueOf(loginMaxErrorTimes)) {
  68. return authInfo.set("error_code", 400).set("error_description", "错误次数超过系统配置的阈值");
  69. }
  70. } else {
  71. currentTimes = "0";
  72. }
  73. String grantType = WebUtil.getRequest().getParameter("grant_type");
  74. String refreshToken = WebUtil.getRequest().getParameter("refresh_token");
  75. String userType = Func.toStr(WebUtil.getRequest().getHeader("User-Type"), "web");
  76. TokenParameter tokenParameter = new TokenParameter();
  77. tokenParameter.getArgs().set("tenantId", tenantId).set("username", username).set("password", password).set("grantType", grantType).set("refreshToken", refreshToken).set("userType", userType);
  78. ITokenGranter granter = TokenGranterBuilder.getGranter(grantType);
  79. UserInfo userInfo = granter.grant(tokenParameter);
  80. if (userInfo != null && userInfo.getUser() != null) {
  81. if(Func.isEmpty(userInfo.getRoles())){
  82. redisTemplate.opsForValue().set(LOGIN_ERROR_PREFIX+tenantId+":"+username,String.valueOf(Integer.valueOf(currentTimes)+1));
  83. return authInfo.set("error_code", 400).set("error_description", "未获得用户的角色信息");
  84. }else {
  85. return TokenUtil.createAuthInfo(userInfo);
  86. }
  87. } else {
  88. redisTemplate.opsForValue().set(LOGIN_ERROR_PREFIX+tenantId+":"+username,String.valueOf(Integer.valueOf(currentTimes)+1));
  89. return authInfo.set("error_code", 400).set("error_description", "用户名或密码不正确");
  90. }
  91. }
  92. @ApiLog("登录用户验证扩展-增加登录错误阈值")
  93. @PostMapping({"/third/oauth/token"})
  94. @ApiOperation(
  95. value = "获取认证token",
  96. notes = "传入租户ID:tenantId,账号:account,密码:password"
  97. )
  98. public Kv OauthToken(@ApiParam(value = "租户ID",required = true) @RequestParam String tenantId,
  99. @ApiParam(value = "账号",required = true) @RequestParam(required = false) String username,
  100. @ApiParam(value = "密码",required = true) @RequestParam(required = false) String password
  101. ) {
  102. Kv authInfo = Kv.create();
  103. String grantType = WebUtil.getRequest().getParameter("grant_type");
  104. String refreshToken = WebUtil.getRequest().getParameter("refresh_token");
  105. String userType = Func.toStr(WebUtil.getRequest().getHeader("User-Type"), "web");
  106. TokenParameter tokenParameter = new TokenParameter();
  107. tokenParameter.getArgs().set("tenantId", tenantId).set("username", username).set("password", password).set("grantType", grantType).set("refreshToken", refreshToken).set("userType", userType);
  108. ITokenGranter granter = null;
  109. if(grantType.equals("social")){
  110. granter = SpringUtil.getBean(SocialTokenGranter.class);
  111. }else{
  112. granter = TokenGranterBuilder.getGranter(grantType);
  113. }
  114. UserInfo userInfo = granter.grant(tokenParameter);
  115. if (userInfo == null || userInfo.getUser() == null) {
  116. return authInfo.set("error_code", HttpServletResponse.SC_BAD_REQUEST).set("error_description", "授权登录失败,请联系平台开通账号!");
  117. }
  118. if (Func.isEmpty(userInfo.getRoles())) {
  119. return authInfo.set("error_code", HttpServletResponse.SC_BAD_REQUEST).set("error_description", "未获得用户的角色信息");
  120. }
  121. return TokenUtil.createAuthInfo(userInfo);
  122. }
  123. /**
  124. * 功能描述: 第三方访问授权
  125. * @return ResultBean
  126. *
  127. *
  128. */
  129. @RequestMapping(value = "/oauth/render/{source}")
  130. @ResponseBody
  131. public R renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException {
  132. log.warn("进入render:" + source);
  133. AuthRequest authRequest = SocialUtil.getAuthRequest(source);
  134. String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
  135. log.warn(authorizeUrl);
  136. return R.data(authorizeUrl);
  137. }
  138. }