فهرست منبع

Merge remote-tracking branch 'origin/master'

zhouhao 2 سال پیش
والد
کامیت
1355f5209f

+ 5 - 3
README.md

@@ -67,6 +67,8 @@ TCP/UDP/MQTT/HTTP、TLS/DTLS、不同厂商、不同设备、不同报文、统
 
 ## 文档
 
-[快速开始](http://doc.jetlinks.cn/install-deployment/start-with-source.html) 
-[开发文档](http://doc.jetlinks.cn/dev-guide/start.html) 
-[常见问题](http://doc.jetlinks.cn/common-problems/install.html) 
+
+[产品文档](https://hanta.yuque.com/px7kg1/yfac2l)
+[快速开始](https://hanta.yuque.com/px7kg1/ryf1pd/zz0o7hc51ys6al05)
+[开发文档](https://hanta.yuque.com/px7kg1/nn1gdr) 
+

+ 1 - 1
jetlinks-components/relation-component/src/main/java/org/jetlinks/community/relation/utils/VariableSource.java

@@ -111,7 +111,7 @@ public class VariableSource implements Serializable {
                                 ConfigKey<?> propertyPath) {
         validate();
         if (getSource() == VariableSource.Source.fixed) {
-            return CastUtils.flatStream(Flux.just(value));
+            return value == null ? Flux.empty() : CastUtils.flatStream(Flux.just(value));
         }
         if (getSource() == VariableSource.Source.upper) {
             return Mono

+ 9 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/configuration/CustomAuthenticationConfiguration.java

@@ -4,7 +4,9 @@ import com.github.benmanes.caffeine.cache.Caffeine;
 import org.hswebframework.web.authorization.token.UserTokenManager;
 import org.hswebframework.web.authorization.token.redis.RedisUserTokenManager;
 import org.hswebframework.web.authorization.token.redis.SimpleUserToken;
+import org.jetlinks.community.auth.enums.UserEntityType;
 import org.jetlinks.community.auth.web.WebFluxUserController;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.ApplicationEventPublisher;
@@ -39,4 +41,11 @@ public class CustomAuthenticationConfiguration {
         userTokenManager.setEventPublisher(eventPublisher);
         return userTokenManager;
     }
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderAuthCustomizer() {
+        return builder -> {
+            builder.deserializerByType(UserEntityType.class, new UserEntityTypeJSONDeserializer());
+        };
+    }
 }

+ 37 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/configuration/UserEntityTypeJSONDeserializer.java

@@ -0,0 +1,37 @@
+package org.jetlinks.community.auth.configuration;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import org.jetlinks.community.auth.enums.UserEntityType;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * 用户类型-反序列化.
+ *
+ * @author zhangji 2022/12/8
+ */
+public class UserEntityTypeJSONDeserializer extends JsonDeserializer<UserEntityType> {
+    @Override
+    public UserEntityType deserialize(JsonParser jsonParser,
+                                      DeserializationContext ctxt) throws IOException, JacksonException {
+        if (jsonParser.hasToken(JsonToken.VALUE_STRING)) {
+            String str = jsonParser.getText().trim();
+            if (str.length() != 0) {
+                return UserEntityType.of(str, null);
+            }
+        }
+
+        if (jsonParser.hasToken(JsonToken.START_OBJECT)) {
+            Map<String, String> map = ctxt.readValue(jsonParser, Map.class);
+            if (map != null) {
+                return UserEntityType.of(map.get("id"), map.get("name"));
+            }
+        }
+        return null;
+    }
+}

+ 9 - 2
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/UserDetail.java

@@ -11,6 +11,9 @@ import org.hswebframework.web.authorization.Dimension;
 import org.hswebframework.web.bean.FastBeanCopier;
 import org.hswebframework.web.system.authorization.api.entity.UserEntity;
 import org.jetlinks.community.auth.dimension.OrgDimensionType;
+import org.jetlinks.community.auth.enums.DefaultUserEntityType;
+import org.jetlinks.community.auth.enums.UserEntityType;
+import org.jetlinks.community.auth.enums.UserEntityTypes;
 import org.jetlinks.reactor.ql.utils.CastUtils;
 
 import java.util.List;
@@ -31,7 +34,7 @@ public class UserDetail {
     private String password;
 
     @Schema(hidden = true)
-    private String type;
+    private UserEntityType type;
 
     @Schema(description = "用户状态。1启用,0禁用")
     private Byte status;
@@ -83,6 +86,7 @@ public class UserDetail {
         }
         this.setUsername(entity.getUsername());
         this.setStatus(entity.getStatus());
+        this.setType(UserEntityTypes.getType(entity.getType()));
         return this;
     }
 
@@ -120,7 +124,10 @@ public class UserDetail {
         userEntity.setName(name);
         userEntity.setUsername(username);
         userEntity.setPassword(password);
-        userEntity.setType(type);
+        // 默认设置类型为普通用户
+        if (type == null && !username.equals("admin")) {
+            userEntity.setType(DefaultUserEntityType.USER.getId());
+        }
         return userEntity;
     }
 

+ 56 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/enums/DefaultUserEntityType.java

@@ -0,0 +1,56 @@
+package org.jetlinks.community.auth.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.hswebframework.web.dict.EnumDict;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 默认用户类型.
+ *
+ * @author zhangji 2022/12/7
+ */
+@Getter
+@AllArgsConstructor
+public enum DefaultUserEntityType implements UserEntityType, EnumDict<String> {
+
+    ADMIN("admin", "超级管理员"),
+    USER("user", "普通用户"),
+    OTHER("other", "其他");
+
+    private final String id;
+
+    private final String name;
+
+    @Override
+    public String getValue() {
+        return id;
+    }
+
+    @Override
+    public String getText() {
+        return name;
+    }
+
+    static Optional<DefaultUserEntityType> of(String id) {
+        return Arrays
+            .stream(values())
+            .filter(type -> type.getId().equals(id))
+            .findAny();
+    }
+
+    @Override
+    public Object getWriteJSONObject() {
+        if (isWriteJSONObjectEnabled()) {
+            Map<String, Object> jsonObject = new HashMap<>();
+            jsonObject.put("id", getId());
+            jsonObject.put("name", getName());
+            return jsonObject;
+        }
+        return name();
+    }
+}

+ 18 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/enums/UndefinedUserEntityType.java

@@ -0,0 +1,18 @@
+package org.jetlinks.community.auth.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 自定义用户类型.
+ *
+ * @author zhangji 2022/12/9
+ */
+@Getter
+@AllArgsConstructor
+public class UndefinedUserEntityType implements UserEntityType {
+
+    private final String id;
+
+    private final String name;
+}

+ 27 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/enums/UserEntityType.java

@@ -0,0 +1,27 @@
+package org.jetlinks.community.auth.enums;
+
+import org.springframework.util.StringUtils;
+
+/**
+ * 用户类型定义.
+ *
+ * @author zhangji 2022/12/7
+ */
+public interface UserEntityType {
+
+    String getId();
+
+    String getName();
+
+    static UserEntityType of(String id,
+                             String name) {
+        if (!StringUtils.hasText(id)) {
+            return null;
+        }
+        return DefaultUserEntityType
+            .of(id)
+            .map(type -> (UserEntityType) type)
+            .orElseGet(() -> new UndefinedUserEntityType(id, StringUtils.hasText(name) ? name : id));
+    }
+
+}

+ 33 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/enums/UserEntityTypes.java

@@ -0,0 +1,33 @@
+package org.jetlinks.community.auth.enums;
+
+import java.util.*;
+
+/**
+ * 用户类型管理.
+ *
+ * @author zhangji 2022/12/8
+ */
+public class UserEntityTypes {
+
+    private static final Map<String, UserEntityType> types = new LinkedHashMap<>();
+
+    public static void register(Collection<UserEntityType> type) {
+        type.forEach(UserEntityTypes::register);
+    }
+
+    public static void register(UserEntityType type) {
+        types.put(type.getId(), type);
+    }
+
+    public static UserEntityType getType(String id) {
+        return types.getOrDefault(id, DefaultUserEntityType.OTHER);
+    }
+
+    public static List<UserEntityType> getAllType() {
+        return new ArrayList<>(types.values());
+    }
+
+    public static UserEntityType of(String id, String name) {
+        return types.put(id, UserEntityType.of(id, name));
+    }
+}

+ 16 - 2
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/UserDetailService.java

@@ -1,6 +1,5 @@
 package org.jetlinks.community.auth.service;
 
-import lombok.AllArgsConstructor;
 import org.hswebframework.web.api.crud.entity.PagerResult;
 import org.hswebframework.web.api.crud.entity.QueryParamEntity;
 import org.hswebframework.web.authorization.Authentication;
@@ -14,6 +13,8 @@ import org.hswebframework.web.system.authorization.api.service.reactive.Reactive
 import org.hswebframework.web.validator.ValidatorUtils;
 import org.jetlinks.community.auth.entity.UserDetail;
 import org.jetlinks.community.auth.entity.UserDetailEntity;
+import org.jetlinks.community.auth.enums.DefaultUserEntityType;
+import org.jetlinks.community.auth.enums.UserEntityTypes;
 import org.jetlinks.community.auth.service.request.SaveUserDetailRequest;
 import org.jetlinks.community.auth.service.request.SaveUserRequest;
 import org.springframework.context.event.EventListener;
@@ -22,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import reactor.core.publisher.Mono;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -37,7 +39,6 @@ import java.util.stream.Collectors;
  * @since 1.3
  */
 @Service
-@AllArgsConstructor
 public class UserDetailService extends GenericReactiveCrudService<UserDetailEntity, String> {
 
     private final ReactiveUserService userService;
@@ -49,6 +50,19 @@ public class UserDetailService extends GenericReactiveCrudService<UserDetailEnti
 
     private final static UserDetailEntity emptyDetail = new UserDetailEntity();
 
+    public UserDetailService(ReactiveUserService userService,
+                             RoleService roleService,
+                             OrganizationService organizationService,
+                             ReactiveAuthenticationManager authenticationManager) {
+        this.userService = userService;
+        this.roleService = roleService;
+        this.organizationService = organizationService;
+        this.authenticationManager = authenticationManager;
+        // 注册默认用户类型
+        UserEntityTypes.register(Arrays.asList(DefaultUserEntityType.values()));
+
+    }
+
     /**
      * 根据用户id获取用户详情
      *

+ 7 - 1
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/web/WebFluxUserController.java

@@ -13,6 +13,7 @@ import org.hswebframework.web.system.authorization.api.PasswordValidator;
 import org.hswebframework.web.system.authorization.api.UsernameValidator;
 import org.hswebframework.web.system.authorization.api.entity.UserEntity;
 import org.hswebframework.web.system.authorization.defaults.service.DefaultReactiveUserService;
+import org.jetlinks.community.auth.enums.DefaultUserEntityType;
 import org.jetlinks.community.web.response.ValidationResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -123,7 +124,12 @@ public class WebFluxUserController extends org.hswebframework.web.system.authori
                     //如果不是新创建用户,则判断是否有权限修改
                     before = assertUserPermission(user.getId());
                 } else {
-                    before = Mono.empty();
+                    before = Mono.fromRunnable(() -> {
+                        // 新建用户时,默认设置类型为普通用户
+                        if (StringUtils.isEmpty(user.getType()) && !user.getUsername().equals("admin")) {
+                            user.setType(DefaultUserEntityType.USER.getId());
+                        }
+                    });
                 }
                 return before
                     .then(super.saveUser(Mono.just(user)))