|
|
@@ -1,5 +1,6 @@
|
|
|
package com.kxs.common.security.service;
|
|
|
|
|
|
+import com.kxs.common.core.constant.CacheConstants;
|
|
|
import com.kxs.common.security.model.LxqSecurityUser;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
@@ -19,6 +20,7 @@ import java.time.temporal.ChronoUnit;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
+import java.util.Set;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
|
@@ -71,20 +73,26 @@ public class LxqRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe
|
|
|
if (isAccessToken(authorization)) {
|
|
|
OAuth2AccessToken accessToken = authorization.getAccessToken().getToken();
|
|
|
long between = ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt());
|
|
|
- redisTemplate.setValueSerializer(RedisSerializer.java());
|
|
|
- redisTemplate.opsForValue()
|
|
|
- .set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), authorization, between,
|
|
|
- TimeUnit.SECONDS);
|
|
|
- //TODO 登陆后保存用户所有token信息
|
|
|
+ //判断单点登录
|
|
|
Object attribute = authorization.getAttribute("java.security.Principal");
|
|
|
+ redisTemplate.setValueSerializer(RedisSerializer.java());
|
|
|
if(attribute instanceof UsernamePasswordAuthenticationToken authenticationToken){
|
|
|
Object principal = authenticationToken.getPrincipal();
|
|
|
if (principal instanceof LxqSecurityUser userDetails) {
|
|
|
+ if(userDetails.getSso()){
|
|
|
+ String key = String.format("%s::%s::*", CacheConstants.PROJECT_OAUTH_ACCESS, userDetails.getId() + userDetails.getUsername());
|
|
|
+ Set<String> keys = redisTemplate.keys(key);
|
|
|
+ redisTemplate.opsForValue().multiGet(keys).forEach(auth -> remove((OAuth2Authorization) auth));
|
|
|
+ redisTemplate.delete(keys);
|
|
|
+ }
|
|
|
redisTemplate.opsForValue()
|
|
|
- .set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, userDetails.getId(), accessToken.getTokenValue()), authorization, between,
|
|
|
+ .set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, userDetails.getId() + userDetails.getUsername(), accessToken.getTokenValue()), authorization, between,
|
|
|
TimeUnit.SECONDS);
|
|
|
}
|
|
|
}
|
|
|
+ redisTemplate.opsForValue()
|
|
|
+ .set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), authorization, between,
|
|
|
+ TimeUnit.SECONDS);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
@@ -136,7 +144,7 @@ public class LxqRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe
|
|
|
private String buildKey(String type, String id) {
|
|
|
return String.format("%s::%s::%s", AUTHORIZATION, type, id);
|
|
|
}
|
|
|
- private String buildKey(String type, Long userId, String id) {
|
|
|
+ private String buildKey(String type, String userId, String id) {
|
|
|
return String.format("%s::%s::%s::%s", AUTHORIZATION, type, userId, id);
|
|
|
}
|
|
|
private static boolean isState(OAuth2Authorization authorization) {
|