Przeglądaj źródła

修复token认证失败问题;新增设备指纹请求头;

woody 1 rok temu
rodzic
commit
a32b5aef8f

+ 52 - 20
framework-base/src/main/java/com/chelvc/framework/base/context/SessionContextHolder.java

@@ -94,6 +94,11 @@ public class SessionContextHolder implements ServletRequestListener {
      */
      */
     public static final String HEADER_SIGNATURE = "Signature";
     public static final String HEADER_SIGNATURE = "Signature";
 
 
+    /**
+     * 设备指纹请求头
+     */
+    public static final String HEADER_FINGERPRINT = "Fingerprint";
+
     /**
     /**
      * 空会话对象实例
      * 空会话对象实例
      */
      */
@@ -175,9 +180,9 @@ public class SessionContextHolder implements ServletRequestListener {
      */
      */
     public static Session initializeSessionPrincipal(@NonNull Long id, @NonNull String business, String mobile,
     public static Session initializeSessionPrincipal(@NonNull Long id, @NonNull String business, String mobile,
                                                      boolean cover) {
                                                      boolean cover) {
-        Session session = null;
-        Deque<Session> deque = null;
-        if (cover || ObjectUtils.ifNull(session = (deque = SESSION_CONTEXT.get()).peek(), Session::getId) == null) {
+        Deque<Session> deque = SESSION_CONTEXT.get();
+        Session session = deque.peek();
+        if (cover || ObjectUtils.ifNull(session, Session::getId) == null) {
             session = Session.builder().id(id).business(business).mobile(mobile)
             session = Session.builder().id(id).business(business).mobile(mobile)
                     .host(ObjectUtils.ifNull(session, Session::getHost))
                     .host(ObjectUtils.ifNull(session, Session::getHost))
                     .device(ObjectUtils.ifNull(session, Session::getDevice))
                     .device(ObjectUtils.ifNull(session, Session::getDevice))
@@ -188,10 +193,8 @@ public class SessionContextHolder implements ServletRequestListener {
                     .terminal(ObjectUtils.ifNull(session, Session::getTerminal))
                     .terminal(ObjectUtils.ifNull(session, Session::getTerminal))
                     .version(ObjectUtils.ifNull(session, Session::getVersion))
                     .version(ObjectUtils.ifNull(session, Session::getVersion))
                     .sequence(ObjectUtils.ifNull(session, Session::getSequence))
                     .sequence(ObjectUtils.ifNull(session, Session::getSequence))
-                    .signature(ObjectUtils.ifNull(session, Session::getSignature)).build();
-            if (deque == null) {
-                deque = SESSION_CONTEXT.get();
-            }
+                    .signature(ObjectUtils.ifNull(session, Session::getSignature))
+                    .fingerprint(ObjectUtils.ifNull(session, Session::getFingerprint)).build();
             deque.poll();
             deque.poll();
             deque.push(session);
             deque.push(session);
         }
         }
@@ -407,6 +410,25 @@ public class SessionContextHolder implements ServletRequestListener {
         return ObjectUtils.ifNull(getSession(requireSession), Session::getBusiness);
         return ObjectUtils.ifNull(getSession(requireSession), Session::getBusiness);
     }
     }
 
 
+    /**
+     * 获取当前终端序列号
+     *
+     * @return 序列号
+     */
+    public static Integer getSequence() {
+        return getSequence(true);
+    }
+
+    /**
+     * 获取当前终端序列号
+     *
+     * @param requireSession 会话是否是必须
+     * @return 序列号
+     */
+    public static Integer getSequence(boolean requireSession) {
+        return ObjectUtils.ifNull(getSession(requireSession), Session::getSequence);
+    }
+
     /**
     /**
      * 获取当前会话签名信息
      * 获取当前会话签名信息
      *
      *
@@ -427,22 +449,22 @@ public class SessionContextHolder implements ServletRequestListener {
     }
     }
 
 
     /**
     /**
-     * 获取当前终端序列号
+     * 获取当前会话设备指纹
      *
      *
-     * @return 序列号
+     * @return 设备指纹
      */
      */
-    public static Integer getSequence() {
-        return getSequence(true);
+    public static String getFingerprint() {
+        return getFingerprint(true);
     }
     }
 
 
     /**
     /**
-     * 获取当前终端序列号
+     * 获取当前会话设备指纹
      *
      *
      * @param requireSession 会话是否是必须
      * @param requireSession 会话是否是必须
-     * @return 序列号
+     * @return 设备指纹
      */
      */
-    public static Integer getSequence(boolean requireSession) {
-        return ObjectUtils.ifNull(getSession(requireSession), Session::getSequence);
+    public static String getFingerprint(boolean requireSession) {
+        return ObjectUtils.ifNull(getSession(requireSession), Session::getFingerprint);
     }
     }
 
 
     /**
     /**
@@ -880,6 +902,16 @@ public class SessionContextHolder implements ServletRequestListener {
         return StringUtils.ifEmpty(request.getHeader(HEADER_BUSINESS), (String) null);
         return StringUtils.ifEmpty(request.getHeader(HEADER_BUSINESS), (String) null);
     }
     }
 
 
+    /**
+     * 获取客户端序号
+     *
+     * @param request Http请求对象
+     * @return 客户端序号
+     */
+    protected Integer getSequence(HttpServletRequest request) {
+        return StringUtils.ifEmpty(request.getHeader(HEADER_SEQUENCE), Integer::parseInt);
+    }
+
     /**
     /**
      * 获取签名信息
      * 获取签名信息
      *
      *
@@ -891,13 +923,13 @@ public class SessionContextHolder implements ServletRequestListener {
     }
     }
 
 
     /**
     /**
-     * 获取客户端序号
+     * 获取设备指纹
      *
      *
      * @param request Http请求对象
      * @param request Http请求对象
-     * @return 客户端序号
+     * @return 设备指纹
      */
      */
-    protected Integer getSequence(HttpServletRequest request) {
-        return StringUtils.ifEmpty(request.getHeader(HEADER_SEQUENCE), Integer::parseInt);
+    protected String getFingerprint(HttpServletRequest request) {
+        return StringUtils.ifEmpty(request.getHeader(HEADER_FINGERPRINT), (String) null);
     }
     }
 
 
     @Override
     @Override
@@ -908,7 +940,7 @@ public class SessionContextHolder implements ServletRequestListener {
                 .initial(this.getInitial(request)).channel(this.getChannel(request)).platform(this.getPlatform(request))
                 .initial(this.getInitial(request)).channel(this.getChannel(request)).platform(this.getPlatform(request))
                 .terminal(this.getTerminal(request)).version(this.getVersion(request))
                 .terminal(this.getTerminal(request)).version(this.getVersion(request))
                 .business(this.getBusiness(request)).sequence(this.getSequence(request))
                 .business(this.getBusiness(request)).sequence(this.getSequence(request))
-                .signature(this.getSignature(request)).build();
+                .signature(this.getSignature(request)).fingerprint(this.getFingerprint(request)).build();
         setSession(session);
         setSession(session);
     }
     }
 
 

+ 5 - 0
framework-base/src/main/java/com/chelvc/framework/base/model/Session.java

@@ -82,4 +82,9 @@ public class Session implements Serializable {
      * 签名信息
      * 签名信息
      */
      */
     private String signature;
     private String signature;
+
+    /**
+     * 设备指纹
+     */
+    private String fingerprint;
 }
 }

+ 1 - 1
framework-boot/pom.xml

@@ -64,7 +64,7 @@
                 <artifactId>apidoc-maven-plugin</artifactId>
                 <artifactId>apidoc-maven-plugin</artifactId>
                 <version>${apidoc-maven-plugin.version}</version>
                 <version>${apidoc-maven-plugin.version}</version>
                 <configuration>
                 <configuration>
-                    <includeHeaders>{Long} Id 主体标识,{String} Mobile 手机号码,{Integer} Tenant 租户标识,{String} Device 设备标识,{String} Channel 渠道来源,{String} Platform 平台标识: PC(PC)、IOS(苹果)、ANDROID(安卓),{String} Terminal 终端标识: ADMIN(后台管理)、APP(App)、APPLET(小程序),{String} Version 终端版本,{String} Business 业务类型,{Integer} Sequence 终端序号,{String} Signature 签名信息,{String} Authorization 认证信息,{Boolean} Initial 是否首次请求</includeHeaders>
+                    <includeHeaders>{Long} Id 主体标识,{String} Mobile 手机号码,{Integer} Tenant 租户标识,{String} Device 设备标识,{String} Channel 渠道来源,{String} Platform 平台标识: PC(PC)、IOS(苹果)、ANDROID(安卓),{String} Terminal 终端标识: ADMIN(后台管理)、APP(App)、APPLET(小程序),{String} Version 终端版本,{String} Business 业务类型,{Integer} Sequence 终端序号,{String} Signature 签名信息,{String} Fingerprint 设备指纹,{String} Authorization 认证信息,{Boolean} Initial 是否首次请求</includeHeaders>
                     <excludeClasses>com.chelvc.framework.base.interceptor.GlobalExceptionInterceptor</excludeClasses>
                     <excludeClasses>com.chelvc.framework.base.interceptor.GlobalExceptionInterceptor</excludeClasses>
                     <analyserFactoryClass>com.chelvc.framework.base.apidoc.MethodAnalyserFactory</analyserFactoryClass>
                     <analyserFactoryClass>com.chelvc.framework.base.apidoc.MethodAnalyserFactory</analyserFactoryClass>
                 </configuration>
                 </configuration>

+ 0 - 38
framework-redis/src/main/java/com/chelvc/framework/redis/config/PrefixRedisSerializer.java

@@ -1,38 +0,0 @@
-package com.chelvc.framework.redis.config;
-
-import java.util.Objects;
-
-import com.chelvc.framework.base.util.StringUtils;
-import lombok.NonNull;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
-
-/**
- * 带前缀的Redis序列化处理器实现
- *
- * @author Woody
- * @date 2023/4/5
- */
-public class PrefixRedisSerializer extends StringRedisSerializer {
-    /**
-     * Key前缀
-     */
-    protected final String prefix;
-
-    public PrefixRedisSerializer(@NonNull String prefix) {
-        this.prefix = prefix;
-    }
-
-    @Override
-    public byte[] serialize(String string) {
-        if (Objects.nonNull(string) && StringUtils.nonEmpty(this.prefix)) {
-            string = this.prefix + string;
-        }
-        return super.serialize(string);
-    }
-
-    @Override
-    public String deserialize(byte[] bytes) {
-        String key = super.deserialize(bytes);
-        return StringUtils.isEmpty(key) || StringUtils.isEmpty(this.prefix) ? key : key.substring(this.prefix.length());
-    }
-}

+ 1 - 8
framework-redis/src/main/java/com/chelvc/framework/redis/config/RedisConfigurer.java

@@ -19,7 +19,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
 import org.springframework.cache.CacheManager;
 import org.springframework.cache.CacheManager;
@@ -59,12 +58,6 @@ public class RedisConfigurer extends CachingConfigurerSupport implements Applica
     private final ClientResources clientResources;
     private final ClientResources clientResources;
     private final LettuceConnectionFactory lettuceConnectionFactory;
     private final LettuceConnectionFactory lettuceConnectionFactory;
 
 
-    /**
-     * Key前缀
-     */
-    @Value("${spring.profiles.active}:")
-    private String prefix;
-
     @Override
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         // Redis事件配置
         // Redis事件配置
@@ -122,7 +115,7 @@ public class RedisConfigurer extends CachingConfigurerSupport implements Applica
     public RedisTemplate<String, Object> redisTemplate() {
     public RedisTemplate<String, Object> redisTemplate() {
         RedisTemplate<String, Object> template = new RedisTemplate<>();
         RedisTemplate<String, Object> template = new RedisTemplate<>();
         template.setConnectionFactory(this.lettuceConnectionFactory);
         template.setConnectionFactory(this.lettuceConnectionFactory);
-        template.setKeySerializer(new PrefixRedisSerializer(this.prefix));
+        template.setKeySerializer(new StringRedisSerializer());
         template.setValueSerializer(this.jackson2JsonRedisSerializer());
         template.setValueSerializer(this.jackson2JsonRedisSerializer());
         template.setHashKeySerializer(new StringRedisSerializer());
         template.setHashKeySerializer(new StringRedisSerializer());
         template.setHashValueSerializer(this.jackson2JsonRedisSerializer());
         template.setHashValueSerializer(this.jackson2JsonRedisSerializer());