package com.doumee.api.gateway; import com.doumee.config.annotation.LoginNoRequired; import com.doumee.config.jwt.JwtProperties; import com.doumee.config.jwt.JwtTokenUtil; import com.doumee.core.annotation.pr.PreventRepeat; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.utils.Constants; import com.doumee.dao.system.dto.LoginDTO; import com.doumee.service.common.CaptchaService; import com.doumee.service.system.SystemLoginService; import com.doumee.service.system.SystemUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ServerWebExchange; import javax.annotation.Resource; /** * JWT获取令牌和刷新令牌接口 */ @RestController @Api(tags ="鉴权登录接口") public class JwtAuthController { @Resource private JwtProperties jwtProperties; @Resource private SystemUserService systemUserService; @Resource private JwtTokenUtil jwtTokenUtil; @Autowired private SystemLoginService systemLoginService; @Autowired private CaptchaService captchaService; /** * @author Eva.Caesar Liu * @date 2023/03/21 14:49 */ @ApiOperation("获取图片验证码") @GetMapping("/captcha") public ApiResponse getCaptcha() { return ApiResponse.success(captchaService.genCaptcha()); } @PreventRepeat(limit = 10, lockTime = 10000) @ApiOperation("登录") @PostMapping("/login") @LoginNoRequired public ApiResponse login (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) { try { ServerHttpRequest request = serverWebExchange.getRequest(); LoginUserInfo user = systemLoginService.loginByPasswordNew(dto,request); String token = jwtTokenUtil.generateToken(user); return ApiResponse.success(token); }catch (BusinessException e){ return ApiResponse.failed(e.getCode(),e.getMessage()); }catch (Exception e){ e.printStackTrace(); return ApiResponse.failed(ResponseStatus.SERVER_ERROR); } } @PreventRepeat(limit = 10, lockTime = 10000) @ApiOperation("H5业务登录") @PostMapping("/loginH5") @LoginNoRequired public ApiResponse loginH5 (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) { try { ServerHttpRequest request = serverWebExchange.getRequest(); dto.setCheckCode(false); LoginUserInfo user = systemLoginService.loginByPasswordNew(dto,request); String token = jwtTokenUtil.generateToken(user); return ApiResponse.success(token); }catch (BusinessException e){ return ApiResponse.failed(e.getCode(),e.getMessage()); }catch (Exception e){ e.printStackTrace(); return ApiResponse.failed(ResponseStatus.SERVER_ERROR); } } /** * 刷新JWT令牌,用旧的令牌换新的令牌 */ @PostMapping("/refreshtoken") @ApiOperation("刷新token") public ApiResponse refreshtoken(@RequestHeader(Constants.HEADER_USER_TOKEN) String oldToken){ try { if(!jwtTokenUtil.isTokenExpired(oldToken)){ return ApiResponse.success(jwtTokenUtil.refreshToken(oldToken)); } return ApiResponse.failed("token已失效"); }catch (BusinessException e){ return ApiResponse.failed(e.getCode(),e.getMessage()); }catch (Exception e){ return ApiResponse.failed(ResponseStatus.SERVER_ERROR); } } /** * 刷新JWT令牌,用旧的令牌换新的令牌 */ @PostMapping("/logout") @ApiOperation("退出登陆") public ApiResponse logout(@RequestHeader(Constants.HEADER_USER_TOKEN) String oldToken){ try { jwtTokenUtil.logout(oldToken); }catch (BusinessException e){ return ApiResponse.failed(e.getCode(),e.getMessage()); }catch (Exception e){ return ApiResponse.failed(ResponseStatus.SERVER_ERROR); } return ApiResponse.success(null); } /** * 刷新JWT令牌,用旧的令牌换新的令牌 */ @GetMapping("/getUserInfo") @ApiOperation("获取当前登陆用户") public ApiResponse getUserInfo(@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ try { LoginUserInfo user =jwtTokenUtil.getUserInfoByToken(token); if(user !=null){ return ApiResponse.success( user); } }catch (BusinessException e){ return ApiResponse.failed(e.getCode(),e.getMessage()); }catch (Exception e){ return ApiResponse.failed(ResponseStatus.SERVER_ERROR); } return ApiResponse.failed( "登录已失效"); } }