Browse Source

refactor: 合并多用户

master
wangxiang 2 years ago
parent
commit
aa5ae7d0fa
No known key found for this signature in database
GPG Key ID: 1BA7946AB6B232E4
  1. 26
      kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/KiccUser.java
  2. 59
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/override/jackson2/ExUserDeserializer.java
  3. 23
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/override/jackson2/ExUserMixin.java
  4. 4
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java
  5. 14
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/util/SecurityUtils.java

26
kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/KiccUser.java

@ -1,11 +1,10 @@ @@ -1,11 +1,10 @@
package com.cloud.kicc.common.data.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
import java.util.Set;
/**
@ -16,12 +15,11 @@ import java.util.Set; @@ -16,12 +15,11 @@ import java.util.Set;
* @Author: wangxiang4
* @Since: 2023/8/16
*/
@Data
@Getter
@Setter
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
public class KiccUser {
public class KiccUser extends CasUser {
/** 部门ID */
private String deptId;
@ -32,4 +30,16 @@ public class KiccUser { @@ -32,4 +30,16 @@ public class KiccUser {
/** 扩展用户权限 */
private Set<String> exPermissions;
public KiccUser(String username,
String password,
Collection<? extends GrantedAuthority> authorities,
String deptId,
String userType,
Set<String> exPermissions) {
super(username, password, authorities);
this.deptId = deptId;
this.userType = userType;
this.exPermissions = exPermissions;
}
}

59
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/override/jackson2/ExUserDeserializer.java

@ -0,0 +1,59 @@ @@ -0,0 +1,59 @@
package com.cloud.kicc.common.security.override.jackson2;
import com.cloud.kicc.common.data.entity.KiccUser;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.MissingNode;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import java.io.IOException;
import java.util.List;
import java.util.Set;
/**
*<p>
* 反序列化扩展用户实现
*</p>
*
* @Author: wangxiang4
* @Since: 2023/8/19
*/
class ExUserDeserializer extends JsonDeserializer<KiccUser> {
private static final TypeReference<Set<String>> EX_PERMISSIONS_SET = new TypeReference<Set<String>>() {};
@Override
public KiccUser deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
JsonNode jsonNode = mapper.readTree(jp);
JsonNode passwordNode = readJsonNode(jsonNode, "password");
String username = readJsonNode(jsonNode, "username").asText();
String password = passwordNode.asText("");
String deptId = readJsonNode(jsonNode, "deptId").asText();
String userType = readJsonNode(jsonNode, "userType").asText();
Set<String> exPermissions = mapper.convertValue(jsonNode.get("exPermissions"), EX_PERMISSIONS_SET);
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(exPermissions.toArray(new String[0]));
KiccUser result = new KiccUser(
username,
password,
authorities,
deptId,
userType,
exPermissions
);
if (passwordNode.asText(null) == null) {
result.eraseCredentials();
}
return result;
}
private JsonNode readJsonNode(JsonNode jsonNode, String field) {
return jsonNode.has(field) ? jsonNode.get(field) : MissingNode.getInstance();
}
}

23
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/override/jackson2/ExUserMixin.java

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
package com.cloud.kicc.common.security.override.jackson2;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
/**
*<p>
* 序列化扩展SSO用户信息
*</p>
*
* @Author: wangxiang4
* @Since: 2023/8/19
*/
@JsonDeserialize(using = ExUserDeserializer.class)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY,
getterVisibility = JsonAutoDetect.Visibility.NONE,
isGetterVisibility = JsonAutoDetect.Visibility.NONE)
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class ExUserMixin {
}

4
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java

@ -10,6 +10,7 @@ import com.cloud.kicc.common.core.enums.CasSystemEnum; @@ -10,6 +10,7 @@ import com.cloud.kicc.common.core.enums.CasSystemEnum;
import com.cloud.kicc.common.data.entity.CasUser;
import com.cloud.kicc.common.data.entity.KiccUser;
import com.cloud.kicc.common.security.exception.SecurityCheckedException;
import com.cloud.kicc.common.security.override.jackson2.ExUserMixin;
import com.cloud.kicc.system.api.entity.User;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
@ -92,6 +93,9 @@ public interface KiccUserDetailsService extends UserDetailsService, Ordered { @@ -92,6 +93,9 @@ public interface KiccUserDetailsService extends UserDetailsService, Ordered {
casUser.getExPrincipals().put(CasSystemEnum.KICC, new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.writeValueAsString(new KiccUser(
user.getUserName(),
SecurityConstants.BCRYPT + user.getPassword(),
authorities,
user.getDeptId(),
user.getUserType(),
dbAuthsSet

14
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/util/SecurityUtils.java

@ -11,6 +11,7 @@ import com.cloud.kicc.common.core.exception.CheckedException; @@ -11,6 +11,7 @@ import com.cloud.kicc.common.core.exception.CheckedException;
import com.cloud.kicc.common.core.util.SpringContextHolderUtil;
import com.cloud.kicc.common.data.entity.CasUser;
import com.cloud.kicc.common.data.entity.KiccUser;
import com.cloud.kicc.common.security.override.jackson2.ExUserMixin;
import com.cloud.kicc.system.api.entity.User;
import com.cloud.kicc.system.api.feign.RemoteUserService;
import com.fasterxml.jackson.annotation.JsonInclude;
@ -73,10 +74,12 @@ public class SecurityUtils { @@ -73,10 +74,12 @@ public class SecurityUtils {
@SneakyThrows
public KiccUser getUser() {
CasUser casUser = getCasUser();
String str = casUser.getExPrincipals().get(CasSystemEnum.KICC);
if (JSONUtil.isJson(str)) {
return new ObjectMapper()
.readValue(str, KiccUser.class);
if (casUser == null) return null;
String user = casUser.getExPrincipals().get(CasSystemEnum.KICC);
if (JSONUtil.isJson(user)) {
KiccUser exUser = new ObjectMapper().addMixIn(KiccUser.class, ExUserMixin.class).readValue(user, KiccUser.class);
BeanUtils.copyProperties(casUser, exUser);
return exUser;
}
return null;
}
@ -135,6 +138,9 @@ public class SecurityUtils { @@ -135,6 +138,9 @@ public class SecurityUtils {
casUser.getExPrincipals().put(CasSystemEnum.KICC, new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.writeValueAsString(new KiccUser(
user.getUserName(),
SecurityConstants.BCRYPT + user.getPassword(),
authorities,
user.getDeptId(),
user.getUserType(),
dbAuthsSet

Loading…
Cancel
Save