Browse Source

单点登录

李学强 2 months ago
parent
commit
93be77d47a

+ 11 - 2
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/model/LxqSecurityUser.java

@@ -41,8 +41,9 @@ public class LxqSecurityUser extends User implements OAuth2AuthenticatedPrincipa
 	 */
 	@Getter
 	private final String phone;
+
 	/**
-	 * 手机号
+	 * 客户端
 	 */
 	@Getter
 	private final String clientId;
@@ -53,6 +54,12 @@ public class LxqSecurityUser extends User implements OAuth2AuthenticatedPrincipa
 	@Getter
 	private final String salt;
 
+	/**
+	 * 是否单点登录
+	 */
+	@Getter
+	private final Boolean sso;
+
 	public LxqSecurityUser(Long id, String username, String password, String phone, String salt, boolean enabled, boolean accountNonExpired,
 						   boolean credentialsNonExpired, boolean accountNonLocked,
 						   Collection<? extends GrantedAuthority> authorities) {
@@ -61,9 +68,10 @@ public class LxqSecurityUser extends User implements OAuth2AuthenticatedPrincipa
 		this.phone = phone;
 		this.salt = salt;
 		this.clientId = null;
+		this.sso = false;
 	}
 
-	public LxqSecurityUser(Long id, String username, String password, String phone, String salt, String clientId, boolean enabled, boolean accountNonExpired,
+	public LxqSecurityUser(Long id, String username, String password, String phone, String salt, String clientId, boolean sso, boolean enabled, boolean accountNonExpired,
 						   boolean credentialsNonExpired, boolean accountNonLocked,
 						   Collection<? extends GrantedAuthority> authorities) {
 		super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
@@ -71,6 +79,7 @@ public class LxqSecurityUser extends User implements OAuth2AuthenticatedPrincipa
 		this.phone = phone;
 		this.salt = salt;
 		this.clientId = clientId;
+		this.sso = true;
 	}
 
 	/**

+ 15 - 7
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/service/LxqRedisOAuth2AuthorizationService.java

@@ -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) {