Преглед на файлове

实现访问密钥生成

欧阳劲驰 преди 2 седмици
родител
ревизия
af4c1406fa
променени са 19 файла, в които са добавени 199 реда и са изтрити 53 реда
  1. 89 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/AccessKeyGenerator.java
  2. 5 7
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/DeviceIdGenerator.java
  3. 4 14
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/DeviceConfig.java
  4. 28 16
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/SecurityConfig.java
  5. 37 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/po/AccessKeys.java
  6. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/DeviceKind.java
  7. 7 3
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/DeviceSequences.java
  8. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/TypeDefine.java
  9. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/mapper/primary/DeviceKindMapper.java
  10. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/mapper/primary/TypeDefineMapper.java
  11. 16 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/repository/embedded/AccessKeysRepository.java
  12. 3 3
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/repository/embedded/DeviceSequencesRepository.java
  13. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/DeviceKindService.java
  14. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/TypeDefineService.java
  15. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/impl/DeviceKindServiceImpl.java
  16. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/impl/TypeDefineServiceImpl.java
  17. 1 1
      custom-gateway-core/src/main/resources/mapper/DeviceKindMapper.xml
  18. 1 1
      custom-gateway-core/src/main/resources/mapper/TypeDefineMapper.xml
  19. BIN
      data.mv.db

+ 89 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/AccessKeyGenerator.java

@@ -0,0 +1,89 @@
+package com.shkpr.service.customgateway.core.components;
+
+import com.shkpr.service.customgateway.core.domain.po.AccessKeys;
+import com.shkpr.service.customgateway.core.repository.embedded.AccessKeysRepository;
+import com.shkpr.service.customgateway.core.utils.HexUtil;
+import org.springframework.security.crypto.keygen.BytesKeyGenerator;
+import org.springframework.security.crypto.keygen.KeyGenerators;
+
+/**
+ * 访问密钥生成器
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+public class AccessKeyGenerator {
+    /**
+     * 访问密钥生成器
+     */
+    private final static BytesKeyGenerator accessKeyGenerator = KeyGenerators.secureRandom(10);
+    /**
+     * 认证密钥生成器
+     */
+    private final static BytesKeyGenerator securityKeyGenerator = KeyGenerators.secureRandom(20);
+    /**
+     * 存储库
+     */
+    private final AccessKeysRepository repository;
+
+    public AccessKeyGenerator(Builder builder) {
+        this.repository = builder.repository;
+    }
+
+    /**
+     * @return 构建
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * 生成密钥
+     *
+     * @return 集成密钥
+     */
+    public AccessKeys generateKey() {
+        //生成密钥
+        byte[] access = accessKeyGenerator.generateKey();
+        byte[] security = securityKeyGenerator.generateKey();
+        //转换字符串
+        String accessKey = HexUtil.encodeHex(access).toUpperCase();
+        String securityKey = HexUtil.encodeHex(security).toUpperCase();
+        //构建并保存
+        AccessKeys accessKeys = AccessKeys.of(accessKey, securityKey);
+        repository.save(accessKeys);
+
+        return accessKeys;
+    }
+
+    /**
+     * 构建器
+     */
+    public static class Builder {
+        /**
+         * 存储库
+         */
+        private AccessKeysRepository repository;
+
+        public Builder() {
+        }
+
+        /**
+         * 配置存储库
+         */
+        public Builder repository(AccessKeysRepository repository) {
+            this.repository = repository;
+            return this;
+        }
+
+        /**
+         * 构建
+         */
+        public AccessKeyGenerator build() {
+            // 参数验证
+            if (repository == null) throw new IllegalStateException("存储库不能为空");
+
+            return new AccessKeyGenerator(this);
+        }
+    }
+}

+ 5 - 7
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/DeviceIdGenerator.java

@@ -3,8 +3,8 @@ package com.shkpr.service.customgateway.core.components;
 import com.shkpr.service.customgateway.core.constants.AreaCode;
 import com.shkpr.service.customgateway.core.constants.DeviceKind;
 import com.shkpr.service.customgateway.core.domain.Device;
-import com.shkpr.service.customgateway.core.domain.DeviceSequences;
 import com.shkpr.service.customgateway.core.domain.DeviceTag;
+import com.shkpr.service.customgateway.core.domain.po.DeviceSequences;
 import com.shkpr.service.customgateway.core.repository.embedded.DeviceSequencesRepository;
 import org.apache.commons.lang3.StringUtils;
 
@@ -24,9 +24,8 @@ public class DeviceIdGenerator {
      * 日期格式
      */
     private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMdd");
-
     /**
-     * 序列
+     * 存储
      */
     private final DeviceSequencesRepository repository;
 
@@ -34,7 +33,6 @@ public class DeviceIdGenerator {
         this.repository = builder.repository;
     }
 
-
     /**
      * @return 构建
      */
@@ -88,7 +86,7 @@ public class DeviceIdGenerator {
 
             //获取序号
             Integer seq = repository.findSeqByDate(date);
-            if (seq == null) seq = repository.save(DeviceSequences.of(null, 1)).getSeq();
+            if (seq == null) seq = repository.save(DeviceSequences.of(date, 1)).getSeq();
 
             //检查序号是否超出范围
             if (9999 < seq) throw new IllegalStateException("当日设备序号已用尽,无法生成新的设备ID");
@@ -102,7 +100,7 @@ public class DeviceIdGenerator {
      */
     public static class Builder {
         /**
-         * 序列文件
+         * 存储库
          */
         private DeviceSequencesRepository repository;
 
@@ -111,7 +109,7 @@ public class DeviceIdGenerator {
         }
 
         /**
-         * 配置文件路径
+         * 配置存储库
          */
         public Builder repository(DeviceSequencesRepository repository) {
             this.repository = repository;

+ 4 - 14
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/DeviceConfig.java

@@ -19,23 +19,13 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 @EnableConfigurationProperties(DeviceProperties.class)
 public class DeviceConfig {
-    final
-    DeviceProperties deviceProperties;
-    final
-    DeviceSequencesRepository deviceSequencesRepository;
-
-    public DeviceConfig(DeviceProperties deviceProperties, DeviceSequencesRepository deviceSequencesRepository) {
-        this.deviceProperties = deviceProperties;
-        this.deviceSequencesRepository = deviceSequencesRepository;
-    }
-
     /**
      * @return 设备注册器
      */
     @Bean
-    public DeviceRegistry deviceRegistry() {
+    public DeviceRegistry deviceRegistry(DeviceProperties properties) {
         return DeviceRegistry.builder()
-                .configFile(deviceProperties.getMapPath())
+                .configFile(properties.getMapPath())
                 .yamlMapper(new ObjectMapper(new YAMLFactory()))
                 .autoLoad(true)
                 .build();
@@ -45,9 +35,9 @@ public class DeviceConfig {
      * @return 设备id生成器
      */
     @Bean
-    public DeviceIdGenerator deviceIdGenerator() {
+    public DeviceIdGenerator deviceIdGenerator(DeviceSequencesRepository repository) {
         return DeviceIdGenerator.builder()
-                .repository(deviceSequencesRepository)
+                .repository(repository)
                 .build();
     }
 }

+ 28 - 16
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/SecurityConfig.java

@@ -1,19 +1,22 @@
 package com.shkpr.service.customgateway.core.config;
 
+import com.shkpr.service.customgateway.core.components.AccessKeyGenerator;
 import com.shkpr.service.customgateway.core.constants.ResponseCode;
 import com.shkpr.service.customgateway.core.filter.TokenFilter;
 import com.shkpr.service.customgateway.core.properties.GlobalProperties;
 import com.shkpr.service.customgateway.core.properties.SecurityProperties;
+import com.shkpr.service.customgateway.core.repository.embedded.AccessKeysRepository;
 import com.shkpr.service.customgateway.core.utils.ResponseUtil;
 import com.shkpr.service.customgateway.core.utils.TokenUtil;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.builders.WebSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
 import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.authentication.AnonymousAuthenticationFilter;
 
 /**
@@ -26,7 +29,7 @@ import org.springframework.security.web.authentication.AnonymousAuthenticationFi
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 @EnableConfigurationProperties(SecurityProperties.class)
-public class SecurityConfig extends WebSecurityConfigurerAdapter {
+public class SecurityConfig {
     final
     GlobalProperties globalProperties;
     final
@@ -40,15 +43,14 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
         this.tokenUtil = tokenUtil;
     }
 
-
     /**
-     * http安全配置
-     * {@inheritDoc}
+     * @return 过滤器链配置
      */
-    @Override
-    protected void configure(HttpSecurity http) throws Exception {
-        //权限
-        http.authorizeRequests()
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        return http
+                //权限
+                .authorizeRequests()
                 .antMatchers(securityProperties.getPermitPattern().toArray(new String[0]))
                 .permitAll()
                 .anyRequest()
@@ -76,16 +78,26 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 .authenticationEntryPoint((request, response, authenticationException) ->
                         ResponseUtil.writeResponseCode(response, ResponseCode.STATUS_NOT_LOGGED_IN, globalProperties.getHttpStatusAlready200())
                 )
-        ;
-
+                .and()
+                .build();
     }
 
     /**
-     * web安全配置
-     * {@inheritDoc}
+     * @return web安全配置
      */
-    @Override
-    public void configure(WebSecurity web) {
+    @Bean
+    public WebSecurityCustomizer webSecurityCustomizer() {
+        return (web) -> {
+        };
+    }
 
+    /**
+     * @return 访问密钥生成器
+     */
+    @Bean
+    public AccessKeyGenerator accessKeyGenerator(AccessKeysRepository repository) {
+        return AccessKeyGenerator.builder()
+                .repository(repository)
+                .build();
     }
 }

+ 37 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/po/AccessKeys.java

@@ -0,0 +1,37 @@
+package com.shkpr.service.customgateway.core.domain.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+
+/**
+ * 访问密钥表
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Table("ACCESS_KEYS")
+public class AccessKeys {
+    /**
+     * 主键
+     */
+    @Id
+    private Long id;
+    /**
+     * 访问密钥
+     */
+    private String accessKey;
+    /**
+     * 认证密钥
+     */
+    private String securityKey;
+
+    public static AccessKeys of(String accessKey, String securityKey) {
+        return new AccessKeys(null, accessKey, securityKey);
+    }
+}

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/DeviceKind.java

@@ -1,4 +1,4 @@
-package com.shkpr.service.customgateway.core.domain;
+package com.shkpr.service.customgateway.core.domain.po;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;

+ 7 - 3
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/DeviceSequences.java

@@ -1,4 +1,4 @@
-package com.shkpr.service.customgateway.core.domain;
+package com.shkpr.service.customgateway.core.domain.po;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -20,9 +20,13 @@ import java.time.LocalDate;
 @Table("DEVICE_SEQUENCES")
 public class DeviceSequences {
     /**
-     * 时间
+     * 主键
      */
     @Id
+    private Long id;
+    /**
+     * 时间
+     */
     private LocalDate date;
     /**
      * 序列
@@ -30,6 +34,6 @@ public class DeviceSequences {
     private Integer seq;
 
     public static DeviceSequences of(LocalDate date, Integer seq) {
-        return new DeviceSequences(date, seq);
+        return new DeviceSequences(null, date, seq);
     }
 }

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/TypeDefine.java

@@ -1,4 +1,4 @@
-package com.shkpr.service.customgateway.core.domain;
+package com.shkpr.service.customgateway.core.domain.po;
 
 import lombok.Data;
 

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/mapper/primary/DeviceKindMapper.java

@@ -1,6 +1,6 @@
 package com.shkpr.service.customgateway.core.mapper.primary;
 
-import com.shkpr.service.customgateway.core.domain.DeviceKind;
+import com.shkpr.service.customgateway.core.domain.po.DeviceKind;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/mapper/primary/TypeDefineMapper.java

@@ -1,6 +1,6 @@
 package com.shkpr.service.customgateway.core.mapper.primary;
 
-import com.shkpr.service.customgateway.core.domain.TypeDefine;
+import com.shkpr.service.customgateway.core.domain.po.TypeDefine;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 

+ 16 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/repository/embedded/AccessKeysRepository.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.customgateway.core.repository.embedded;
+
+import com.shkpr.service.customgateway.core.domain.po.AccessKeys;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 设备序列库
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Repository
+public interface AccessKeysRepository extends CrudRepository<AccessKeys, String> {
+
+}

+ 3 - 3
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/repository/embedded/DeviceSequencesRepository.java

@@ -1,6 +1,6 @@
 package com.shkpr.service.customgateway.core.repository.embedded;
 
-import com.shkpr.service.customgateway.core.domain.DeviceSequences;
+import com.shkpr.service.customgateway.core.domain.po.DeviceSequences;
 import org.springframework.data.jdbc.repository.query.Modifying;
 import org.springframework.data.jdbc.repository.query.Query;
 import org.springframework.data.repository.CrudRepository;
@@ -24,8 +24,8 @@ public interface DeviceSequencesRepository extends CrudRepository<DeviceSequence
      * @param date 日期
      */
     @Modifying
-    @Query("merge into device_sequences key (date) values " +
-            "(:date, coalesce((select seq from device_sequences where date = :date), 0) + 1)")
+    @Query("merge into device_sequences (date, seq) key (date)" +
+            " values (:date, coalesce((select seq from device_sequences where date = :date), 0) + 1)")
     void incrementSeqBYDate(@Param("date") LocalDate date);
 
     /**

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/DeviceKindService.java

@@ -1,6 +1,6 @@
 package com.shkpr.service.customgateway.core.service;
 
-import com.shkpr.service.customgateway.core.domain.DeviceKind;
+import com.shkpr.service.customgateway.core.domain.po.DeviceKind;
 
 import java.util.List;
 

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/TypeDefineService.java

@@ -1,6 +1,6 @@
 package com.shkpr.service.customgateway.core.service;
 
-import com.shkpr.service.customgateway.core.domain.TypeDefine;
+import com.shkpr.service.customgateway.core.domain.po.TypeDefine;
 
 import java.util.List;
 

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/impl/DeviceKindServiceImpl.java

@@ -1,6 +1,6 @@
 package com.shkpr.service.customgateway.core.service.impl;
 
-import com.shkpr.service.customgateway.core.domain.DeviceKind;
+import com.shkpr.service.customgateway.core.domain.po.DeviceKind;
 import com.shkpr.service.customgateway.core.mapper.primary.DeviceKindMapper;
 import com.shkpr.service.customgateway.core.service.DeviceKindService;
 import org.springframework.stereotype.Service;

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/impl/TypeDefineServiceImpl.java

@@ -1,6 +1,6 @@
 package com.shkpr.service.customgateway.core.service.impl;
 
-import com.shkpr.service.customgateway.core.domain.TypeDefine;
+import com.shkpr.service.customgateway.core.domain.po.TypeDefine;
 import com.shkpr.service.customgateway.core.mapper.primary.TypeDefineMapper;
 import com.shkpr.service.customgateway.core.service.TypeDefineService;
 import org.springframework.stereotype.Service;

+ 1 - 1
custom-gateway-core/src/main/resources/mapper/DeviceKindMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.shkpr.service.customgateway.core.mapper.primary.DeviceKindMapper">
-    <select id="findByKeys" resultType="com.shkpr.service.customgateway.core.domain.DeviceKind">
+    <select id="findByKeys" resultType="com.shkpr.service.customgateway.core.domain.po.DeviceKind">
         select id,
         uid,
         name,

+ 1 - 1
custom-gateway-core/src/main/resources/mapper/TypeDefineMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.shkpr.service.customgateway.core.mapper.primary.TypeDefineMapper">
-    <select id="findByKeys" resultType="com.shkpr.service.customgateway.core.domain.TypeDefine">
+    <select id="findByKeys" resultType="com.shkpr.service.customgateway.core.domain.po.TypeDefine">
         select id,
         key,
         kind,

BIN
data.mv.db