|
|
@@ -28,6 +28,7 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.servlet.http.Cookie;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
import java.security.interfaces.RSAPrivateKey;
|
|
|
import java.security.interfaces.RSAPublicKey;
|
|
|
import java.util.List;
|
|
|
@@ -63,39 +64,42 @@ public class AccountTokenServiceImpl implements AccountTokenService {
|
|
|
|
|
|
@Override
|
|
|
public AccountToken grantUserToken(AccountAuthToken authToken) {
|
|
|
+ String signKeyRandom = RandomString.getSalt(64);
|
|
|
+ RSAPrivateKey signKeyPrivate = null;
|
|
|
+ try {
|
|
|
+ signKeyPrivate = pubkeyService.getPrivateKey();
|
|
|
+ } catch (NoSuchAlgorithmException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
long userId = authToken.getUserId();
|
|
|
long accessExpireIn = 1000L*3600*24*7;
|
|
|
long accessExpireAt = System.currentTimeMillis() + accessExpireIn;
|
|
|
String accessToken = "";
|
|
|
- try {
|
|
|
- RSAPrivateKey privateKey = pubkeyService.getPrivateKey();
|
|
|
- accessToken = JwtUtil.createAccessToken(authToken, userId, accessExpireAt, privateKey);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("error -> {}", e.getMessage());
|
|
|
- }
|
|
|
-
|
|
|
- String accessSignKey = RandomString.getSalt(64);
|
|
|
- if (accessToken.isBlank()) {
|
|
|
- accessToken = JwtUtil.createAccessToken(authToken, userId, accessExpireAt, accessSignKey);
|
|
|
+ if (signKeyPrivate != null) {
|
|
|
+ accessToken = JwtUtil.createAccessToken(authToken, userId, accessExpireAt, signKeyPrivate);
|
|
|
+ } else {
|
|
|
+ accessToken = JwtUtil.createAccessToken(authToken, userId, accessExpireAt, signKeyRandom);
|
|
|
}
|
|
|
|
|
|
long refreshExpireIn = accessExpireIn*4;
|
|
|
long refreshExpireAt = System.currentTimeMillis() + refreshExpireIn;
|
|
|
- String refreshSignKey = RandomString.getSalt(64);
|
|
|
- String refreshToken = JwtUtil.createRefreshToken(authToken, refreshExpireAt, refreshSignKey);
|
|
|
+ String refreshToken = JwtUtil.createRefreshToken(authToken, refreshExpireAt, signKeyRandom);
|
|
|
|
|
|
- redisStringObject.setWithTimeout(RedisKeys.getAccessSignKeyKey(accessToken), accessSignKey, accessExpireIn);
|
|
|
- redisStringObject.setWithTimeout(RedisKeys.getRefreshSignKeyKey(refreshToken), refreshSignKey, refreshExpireIn);
|
|
|
+ if (signKeyPrivate == null) {
|
|
|
+ redisString.setWithTimeout(RedisKeys.getAccessSignKeyKey(accessToken), signKeyRandom, accessExpireIn);
|
|
|
+ }
|
|
|
+ redisString.setWithTimeout(RedisKeys.getRefreshSignKeyKey(refreshToken), signKeyRandom, refreshExpireIn);
|
|
|
|
|
|
String loginId = authToken.getLoginId();
|
|
|
redisStringObject.setWithTimeout(RedisKeys.getAuthTokenKey(userId, loginId), authToken, accessExpireIn);
|
|
|
- redisStringObject.setWithTimeout(RedisKeys.getAccessTokenKey(userId, loginId), accessToken, accessExpireIn);
|
|
|
- redisStringObject.setWithTimeout(RedisKeys.getRefreshTokenKey(userId, loginId), refreshToken, refreshExpireIn);
|
|
|
+ redisString.setWithTimeout(RedisKeys.getAccessTokenKey(userId, loginId), accessToken, accessExpireIn);
|
|
|
+ redisString.setWithTimeout(RedisKeys.getRefreshTokenKey(userId, loginId), refreshToken, refreshExpireIn);
|
|
|
return new AccountToken(accessToken, accessExpireAt, refreshToken, refreshExpireAt);
|
|
|
}
|
|
|
|
|
|
public void refreshToken(long userId, String loginId) {
|
|
|
-
|
|
|
+ log.info("令牌刷新尚未实现");
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -142,12 +146,16 @@ public class AccountTokenServiceImpl implements AccountTokenService {
|
|
|
deleteSession(loginId);
|
|
|
}
|
|
|
|
|
|
- SecurityContext context = SecurityContextHolder.getContext();
|
|
|
- context.setAuthentication(null);
|
|
|
- SecurityContextHolder.clearContext();
|
|
|
+ clearSecurityContext();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void clearSecurityContext() {
|
|
|
+ SecurityContext context = SecurityContextHolder.getContext();
|
|
|
+ context.setAuthentication(null);
|
|
|
+ SecurityContextHolder.clearContext();
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void clearCookie() {
|
|
|
String path = "/";
|
|
|
@@ -161,6 +169,7 @@ public class AccountTokenServiceImpl implements AccountTokenService {
|
|
|
|
|
|
@Override
|
|
|
public void logout(String loginId) {
|
|
|
+ String currentLoginId = getAuthToken().getLoginId();
|
|
|
List<LoginAttempts> loginAttemptsList = loginAttemptsMapper.findByLoginIds(List.of(loginId));
|
|
|
if (!loginAttemptsList.isEmpty() && !loginAttemptsList.get(0).getRememberMe()) {
|
|
|
LoginAttempts loginAttempts = loginAttemptsList.get(0);
|
|
|
@@ -172,12 +181,16 @@ public class AccountTokenServiceImpl implements AccountTokenService {
|
|
|
String userdata = String.format("%s:%s:%s", userId, plat, loginId);
|
|
|
deleteSession(loginId);
|
|
|
}
|
|
|
+
|
|
|
+ if (loginId.equals(currentLoginId)) {
|
|
|
+ clearSecurityContext();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void revokeUserToken(long userId, String loginId) {
|
|
|
- String refreshToken = redisString.get(RedisKeys.getRefreshTokenKey(userId, loginId));
|
|
|
String accessToken = redisString.get(RedisKeys.getAccessTokenKey(userId, loginId));
|
|
|
+ String refreshToken = redisString.get(RedisKeys.getRefreshTokenKey(userId, loginId));
|
|
|
String[] keys = List.of(
|
|
|
RedisKeys.getAuthTokenKey(userId, loginId),
|
|
|
RedisKeys.getAccessTokenKey(userId, loginId),
|
|
|
@@ -218,16 +231,15 @@ public class AccountTokenServiceImpl implements AccountTokenService {
|
|
|
if (!loginIds.isEmpty()) {
|
|
|
loginIds.forEach(this::logout);
|
|
|
}
|
|
|
+
|
|
|
+ long loginUser = getAuthToken().getUserId();
|
|
|
+ if (loginUser == userId) {
|
|
|
+ clearSecurityContext();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void deleteOnSessionExpired(String loginId) {
|
|
|
- /*LoginAttempts loginAttempts = loginAttemptsMapper.findByLoginId(loginId);
|
|
|
- if (loginAttempts != null && !loginAttempts.getRememberMe()) {
|
|
|
- long userId = loginAttempts.getUserId();
|
|
|
- int plat = loginAttempts.getPlat();
|
|
|
- deleteSession(userId, plat, loginId, false);
|
|
|
- }*/
|
|
|
}
|
|
|
|
|
|
@Override
|