AdminAuthController.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package cc.uncarbon.module.sys.web.auth;
  2. import cc.uncarbon.framework.core.constant.HelioConstant;
  3. import cc.uncarbon.framework.core.context.TenantContext;
  4. import cc.uncarbon.framework.core.context.TenantContextHolder;
  5. import cc.uncarbon.framework.core.context.UserContext;
  6. import cc.uncarbon.framework.core.context.UserContextHolder;
  7. import cc.uncarbon.framework.core.exception.BusinessException;
  8. import cc.uncarbon.framework.web.model.response.ApiResult;
  9. import cc.uncarbon.helper.CaptchaHelper;
  10. import cc.uncarbon.helper.RolePermissionCacheHelper;
  11. import cc.uncarbon.module.sys.constant.SysConstant;
  12. import cc.uncarbon.module.sys.enums.SysErrorEnum;
  13. import cc.uncarbon.module.sys.enums.UserTypeEnum;
  14. import cc.uncarbon.module.sys.model.request.SysUserLoginDTO;
  15. import cc.uncarbon.module.sys.model.response.SysUserLoginBO;
  16. import cc.uncarbon.module.sys.model.response.SysUserLoginVO;
  17. import cc.uncarbon.module.sys.service.SysUserService;
  18. import cc.uncarbon.module.sys.util.AdminStpUtil;
  19. import cn.dev33.satoken.annotation.SaCheckLogin;
  20. import cn.hutool.captcha.AbstractCaptcha;
  21. import cn.hutool.core.lang.Assert;
  22. import io.swagger.annotations.Api;
  23. import io.swagger.annotations.ApiImplicitParam;
  24. import io.swagger.annotations.ApiOperation;
  25. import java.io.IOException;
  26. import javax.servlet.http.HttpServletResponse;
  27. import javax.validation.Valid;
  28. import lombok.RequiredArgsConstructor;
  29. import lombok.extern.slf4j.Slf4j;
  30. import org.springframework.http.MediaType;
  31. import org.springframework.web.bind.annotation.GetMapping;
  32. import org.springframework.web.bind.annotation.PostMapping;
  33. import org.springframework.web.bind.annotation.RequestBody;
  34. import org.springframework.web.bind.annotation.RequestMapping;
  35. import org.springframework.web.bind.annotation.RestController;
  36. /**
  37. * @author Uncarbon
  38. */
  39. @RequiredArgsConstructor
  40. @Slf4j
  41. @Api(value = "SaaS后台管理鉴权接口", tags = {"SaaS后台管理鉴权接口"})
  42. @RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/auth")
  43. @RestController
  44. public class AdminAuthController {
  45. private final SysUserService sysUserService;
  46. private final RolePermissionCacheHelper rolePermissionCacheHelper;
  47. private final CaptchaHelper captchaHelper;
  48. @ApiOperation(value = "登录", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
  49. @PostMapping(value = "/login")
  50. public ApiResult<SysUserLoginVO> login(@RequestBody @Valid SysUserLoginDTO dto) {
  51. // RPC调用, 失败抛异常, 成功返回用户信息
  52. SysUserLoginBO userInfo = sysUserService.adminLogin(dto);
  53. // 构造用户上下文
  54. UserContext userContext = UserContext.builder()
  55. .userId(userInfo.getId())
  56. .userName(userInfo.getUsername())
  57. .userPhoneNo(userInfo.getPhoneNo())
  58. .userType(UserTypeEnum.ADMIN_USER)
  59. .extraData(null)
  60. .rolesIds(userInfo.getRoleIds())
  61. .roles(userInfo.getRoles())
  62. .build();
  63. // 将用户ID注册到 SA-Token ,并附加一些业务字段
  64. AdminStpUtil.login(userInfo.getId(), dto.getRememberMe());
  65. AdminStpUtil.getSession().set(UserContext.CAMEL_NAME, userContext);
  66. AdminStpUtil.getSession().set(TenantContext.CAMEL_NAME, userInfo.getTenantContext());
  67. // 更新角色-权限缓存
  68. rolePermissionCacheHelper.putCache(userInfo.getRoleIdPermissionMap());
  69. // 返回登录token
  70. SysUserLoginVO tokenInfo = SysUserLoginVO.builder()
  71. .tokenName(AdminStpUtil.getTokenName())
  72. .tokenValue(AdminStpUtil.getTokenValue())
  73. .roles(userInfo.getRoles())
  74. .permissions(userInfo.getPermissions())
  75. .build();
  76. return ApiResult.data("登录成功", tokenInfo);
  77. }
  78. @SaCheckLogin(type = AdminStpUtil.TYPE)
  79. @ApiOperation(value = "登出", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
  80. @PostMapping(value = "/logout")
  81. public ApiResult<?> logout() {
  82. AdminStpUtil.logout();
  83. UserContextHolder.setUserContext(null);
  84. TenantContextHolder.setTenantContext(null);
  85. return ApiResult.success();
  86. }
  87. @ApiOperation(value = "验证码图片")
  88. @ApiImplicitParam(name = "uuid", value = "验证码图片UUID", required = true)
  89. @GetMapping(value = "/captcha")
  90. public void captcha(HttpServletResponse response, String uuid) throws IOException {
  91. Assert.notBlank(uuid, () -> new BusinessException(SysErrorEnum.UUID_CANNOT_BE_BLANK));
  92. // 核验方法:captchaHelper.validate(uuid, true);
  93. AbstractCaptcha captcha = captchaHelper.generate(uuid);
  94. // 写入响应流
  95. response.setHeader("Cache-Control", "no-store, no-cache");
  96. response.setContentType("image/png");
  97. captcha.write(response.getOutputStream());
  98. }
  99. }