diff --git a/api/src/main/java/com/databasir/api/config/security/DatabasirAuthenticationEntryPoint.java b/api/src/main/java/com/databasir/api/config/security/DatabasirAuthenticationEntryPoint.java index 6be00ce..0855e8d 100644 --- a/api/src/main/java/com/databasir/api/config/security/DatabasirAuthenticationEntryPoint.java +++ b/api/src/main/java/com/databasir/api/config/security/DatabasirAuthenticationEntryPoint.java @@ -1,26 +1,39 @@ package com.databasir.api.config.security; +import com.databasir.common.JsonData; +import com.databasir.core.domain.DomainErrors; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Service; import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.nio.charset.StandardCharsets; @Service @RequiredArgsConstructor @Slf4j public class DatabasirAuthenticationEntryPoint implements AuthenticationEntryPoint { + private final ObjectMapper objectMapper; + @Override public void commence(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { - log.warn("验证未通过. 提示信息 - {} - {}", request.getRequestURI(), authException.getMessage()); - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage()); + log.warn("验证未通过. 提示信息 - {} - {} {}", request.getRequestURI(), + authException.getClass().getName(), + authException.getMessage()); + + DomainErrors err = DomainErrors.INVALID_REFRESH_TOKEN_OPERATION; + JsonData<Void> data = JsonData.error(err.getErrCode(), err.getErrMessage()); + String jsonString = objectMapper.writeValueAsString(data); + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + response.getOutputStream().write(jsonString.getBytes(StandardCharsets.UTF_8)); } } diff --git a/core/src/main/java/com/databasir/core/domain/login/service/LoginService.java b/core/src/main/java/com/databasir/core/domain/login/service/LoginService.java index dc7a7ab..9b0217d 100644 --- a/core/src/main/java/com/databasir/core/domain/login/service/LoginService.java +++ b/core/src/main/java/com/databasir/core/domain/login/service/LoginService.java @@ -45,8 +45,8 @@ public class LoginService { if (login.getRefreshTokenExpireAt().isBefore(LocalDateTime.now())) { throw DomainErrors.REFRESH_TOKEN_EXPIRED.exception(); } - // access-token 未过期就开始刷新有可能是 refresh-token 泄露了,删除 refresh-token - if (login.getAccessTokenExpireAt().isAfter(LocalDateTime.now())) { + // access-token 未过期(允许一分钟的误差)就开始刷新有可能是 refresh-token 泄露了,删除 refresh-token + if (login.getAccessTokenExpireAt().isAfter(LocalDateTime.now().plusMinutes(1))) { log.warn("invalid access token refresh operation: request = {}, login = {}", request, login); loginDao.deleteByUserId(login.getUserId()); throw DomainErrors.INVALID_REFRESH_TOKEN_OPERATION.exception(); @@ -58,6 +58,10 @@ public class LoginService { log.warn("user not exists but refresh token exists for " + login.getRefreshToken()); return DomainErrors.INVALID_REFRESH_TOKEN_OPERATION.exception(); }); + if (!user.getEnabled()) { + log.warn("user disabled but refresh token exists for " + login.getRefreshToken()); + throw DomainErrors.INVALID_REFRESH_TOKEN_OPERATION.exception(); + } String accessToken = jwtTokens.accessToken(user.getEmail()); LocalDateTime accessTokenExpireAt = jwtTokens.expireAt(accessToken); loginDao.updateAccessToken(accessToken, accessTokenExpireAt, user.getId());