9 Komitmen eada0d8c9e ... b5f86a3636

Pembuat SHA1 Pesan Tanggal
  AA b5f86a3636 [Feature] HuaWei ZeroTrust V1.0 8 bulan lalu
  AA f3b2b040a2 [Feature] 飘窗V1.0 10 bulan lalu
  AA ce20e28e77 [Feature] 在线留言V1.0 10 bulan lalu
  AA 878253255a Reset Property files 11 bulan lalu
  AA 82e2792575 [Feature] Message Send Interface: bugfix 11 bulan lalu
  AA 9612a24bb9 [Feature] Message Send Interface: Update Message Sending Interface 11 bulan lalu
  AA 0ce9a7b951 [Feature] Message Send Interface: Add HMAC authentication 11 bulan lalu
  AA b012fb23c7 Add database init file 11 bulan lalu
  AA fcad059d43 Format All Files 11 bulan lalu
100 mengubah file dengan 1798 tambahan dan 531 penghapusan
  1. 393 0
      db/db230901-init.sql
  2. 0 0
      db/db230902-initData.sql
  3. 2 0
      db/db240716-addAppKeyAndSecret.sql
  4. 36 0
      db/db240817-addCommentTable.sql
  5. 10 0
      db/db240818-addFloatingWindow.sql
  6. 32 8
      pom.xml
  7. 5 0
      src/main/java/com/dragon/tj/portal/PortalServiceApplication.java
  8. 6 0
      src/main/java/com/dragon/tj/portal/auth/common/constants/AuthType.java
  9. 6 0
      src/main/java/com/dragon/tj/portal/auth/common/constants/Role.java
  10. 42 0
      src/main/java/com/dragon/tj/portal/auth/config/RetrofitCasConfig.java
  11. 5 31
      src/main/java/com/dragon/tj/portal/auth/config/RetrofitConfig.java
  12. 41 0
      src/main/java/com/dragon/tj/portal/auth/config/RetrofitZeroTrustConfig.java
  13. 125 0
      src/main/java/com/dragon/tj/portal/auth/config/WebSecurityCasConfig.java
  14. 46 111
      src/main/java/com/dragon/tj/portal/auth/config/WebSecurityConfig.java
  15. 105 0
      src/main/java/com/dragon/tj/portal/auth/config/WebSecurityZeroTrustConfig.java
  16. 29 0
      src/main/java/com/dragon/tj/portal/auth/config/WebServletConfig.java
  17. 6 3
      src/main/java/com/dragon/tj/portal/auth/controller/SsoController.java
  18. 10 3
      src/main/java/com/dragon/tj/portal/auth/controller/UserController.java
  19. 23 12
      src/main/java/com/dragon/tj/portal/auth/model/LoginUser.java
  20. 26 0
      src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthenticationMsg.java
  21. 35 0
      src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthenticationResponse.java
  22. 71 0
      src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthenticationResult.java
  23. 30 0
      src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthorizationRequest.java
  24. 38 0
      src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthorizationResponse.java
  25. 17 0
      src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthorizationResult.java
  26. 2 2
      src/main/java/com/dragon/tj/portal/auth/module/cas/CasAuthenticationClient.java
  27. 2 2
      src/main/java/com/dragon/tj/portal/auth/module/cas/CasAuthorizationClient.java
  28. 12 13
      src/main/java/com/dragon/tj/portal/auth/module/cas/MyCasAuthenticationEntryPoint.java
  29. 2 1
      src/main/java/com/dragon/tj/portal/auth/module/cas/MySimpleUrlAuthenticationSuccessHandler.java
  30. 96 0
      src/main/java/com/dragon/tj/portal/auth/module/hmac/HmacAuthenticationFilter.java
  31. 14 0
      src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthenticationClient.java
  32. 29 0
      src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthenticationFilter.java
  33. 48 0
      src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthenticationProvider.java
  34. 13 0
      src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthorizeClient.java
  35. 16 0
      src/main/java/com/dragon/tj/portal/auth/properties/AppProperties.java
  36. 15 0
      src/main/java/com/dragon/tj/portal/auth/properties/CasProperties.java
  37. 16 0
      src/main/java/com/dragon/tj/portal/auth/properties/ZeroTrustProperties.java
  38. 4 3
      src/main/java/com/dragon/tj/portal/auth/service/JwtTokenAuthenticationFilter.java
  39. 9 12
      src/main/java/com/dragon/tj/portal/auth/service/JwtTokenLogoutSuccessHandler.java
  40. 0 1
      src/main/java/com/dragon/tj/portal/auth/service/MyUserDetailsByNameServiceWrapper.java
  41. 25 15
      src/main/java/com/dragon/tj/portal/auth/service/MyUserDetailsService.java
  42. 56 13
      src/main/java/com/dragon/tj/portal/auth/service/SysPermissionService.java
  43. 46 0
      src/main/java/com/dragon/tj/portal/auth/util/SSLSocketManager.java
  44. 0 1
      src/main/java/com/dragon/tj/portal/auth/util/SecurityUtils.java
  45. 0 1
      src/main/java/com/dragon/tj/portal/auth/web/convert/DeptTreeNodeConvert.java
  46. 2 2
      src/main/java/com/dragon/tj/portal/auth/web/entity/SysDept.java
  47. 2 2
      src/main/java/com/dragon/tj/portal/auth/web/entity/SysMenu.java
  48. 2 2
      src/main/java/com/dragon/tj/portal/auth/web/entity/SysRole.java
  49. 2 1
      src/main/java/com/dragon/tj/portal/auth/web/entity/SysUser.java
  50. 1 1
      src/main/java/com/dragon/tj/portal/auth/web/mapper/SysDeptMapper.java
  51. 1 1
      src/main/java/com/dragon/tj/portal/auth/web/mapper/SysMenuMapper.java
  52. 1 1
      src/main/java/com/dragon/tj/portal/auth/web/mapper/SysRoleMapper.java
  53. 2 2
      src/main/java/com/dragon/tj/portal/auth/web/mapper/SysUserMapper.java
  54. 1 2
      src/main/java/com/dragon/tj/portal/auth/web/service/SysDeptService.java
  55. 1 1
      src/main/java/com/dragon/tj/portal/auth/web/service/SysMenuService.java
  56. 1 1
      src/main/java/com/dragon/tj/portal/auth/web/service/SysRoleService.java
  57. 4 2
      src/main/java/com/dragon/tj/portal/auth/web/service/SysUserService.java
  58. 1 1
      src/main/java/com/dragon/tj/portal/auth/web/service/impl/SysMenuServiceImpl.java
  59. 1 1
      src/main/java/com/dragon/tj/portal/auth/web/service/impl/SysRoleServiceImpl.java
  60. 57 18
      src/main/java/com/dragon/tj/portal/auth/web/service/impl/SysUserServiceImpl.java
  61. 9 11
      src/main/java/com/dragon/tj/portal/common/constants/BusinessConstants.java
  62. 0 1
      src/main/java/com/dragon/tj/portal/common/constants/CacheConstants.java
  63. 2 1
      src/main/java/com/dragon/tj/portal/common/constants/CommonConstants.java
  64. 8 9
      src/main/java/com/dragon/tj/portal/common/constants/DateTimeFormatterConstant.java
  65. 0 1
      src/main/java/com/dragon/tj/portal/common/convert/log/SysLogDTO2SysLogConvert.java
  66. 0 1
      src/main/java/com/dragon/tj/portal/common/convert/mesage/MessageReqConvert.java
  67. 0 2
      src/main/java/com/dragon/tj/portal/common/convert/notice/NoticeReqConvert.java
  68. 1 9
      src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoItem.java
  69. 3 11
      src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoReq.java
  70. 0 3
      src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoSend.java
  71. 0 1
      src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoUserInfo.java
  72. 0 6
      src/main/java/com/dragon/tj/portal/common/dto/notice/NoticeInfoItem.java
  73. 15 30
      src/main/java/com/dragon/tj/portal/common/dto/notice/NoticeInfoReq.java
  74. 0 1
      src/main/java/com/dragon/tj/portal/common/dto/notice/NoticeInfoSend.java
  75. 6 1
      src/main/java/com/dragon/tj/portal/common/enums/log/ModuleEnum.java
  76. 0 3
      src/main/java/com/dragon/tj/portal/common/enums/message/MessageInfoErrorEnums.java
  77. 4 4
      src/main/java/com/dragon/tj/portal/common/enums/message/MsgRecordTypeEnum.java
  78. 3 3
      src/main/java/com/dragon/tj/portal/common/util/UploadUtils.java
  79. 0 2
      src/main/java/com/dragon/tj/portal/common/vo/app/AppInfoVo.java
  80. 0 2
      src/main/java/com/dragon/tj/portal/common/vo/log/LogPageParam.java
  81. 0 2
      src/main/java/com/dragon/tj/portal/common/vo/message/MessageInfoParam.java
  82. 0 2
      src/main/java/com/dragon/tj/portal/common/vo/message/MessageInfoVO.java
  83. 2 5
      src/main/java/com/dragon/tj/portal/common/vo/message/MessagePageParam.java
  84. 0 2
      src/main/java/com/dragon/tj/portal/common/vo/notice/NoticeInfoParam.java
  85. 4 6
      src/main/java/com/dragon/tj/portal/common/vo/notice/NoticeInfoVO.java
  86. 2 4
      src/main/java/com/dragon/tj/portal/common/vo/notice/NoticePageParam.java
  87. 0 1
      src/main/java/com/dragon/tj/portal/component/exception/base/FrameAbstractException.java
  88. 0 5
      src/main/java/com/dragon/tj/portal/component/exception/base/FrameResultError.java
  89. 2 2
      src/main/java/com/dragon/tj/portal/component/exception/base/GlobalExceptionHandler.java
  90. 1 1
      src/main/java/com/dragon/tj/portal/component/interceptor/FileInterceptor.java
  91. 5 1
      src/main/java/com/dragon/tj/portal/component/log/annotation/SysLog.java
  92. 0 1
      src/main/java/com/dragon/tj/portal/component/log/aspect/SysLogAspect.java
  93. 89 89
      src/main/java/com/dragon/tj/portal/component/log/dto/SysLogDTO.java
  94. 4 4
      src/main/java/com/dragon/tj/portal/component/log/event/SysLogEvent.java
  95. 0 1
      src/main/java/com/dragon/tj/portal/component/log/uitl/LogTypeEnum.java
  96. 3 6
      src/main/java/com/dragon/tj/portal/component/log/uitl/SysLogUtils.java
  97. 1 6
      src/main/java/com/dragon/tj/portal/component/message/KafkaInitialConfiguration.java
  98. 4 7
      src/main/java/com/dragon/tj/portal/component/message/MessageProducer.java
  99. 4 4
      src/main/java/com/dragon/tj/portal/component/message/OpenApiSseEmitter.java
  100. 3 10
      src/main/java/com/dragon/tj/portal/component/message/SseController.java

+ 393 - 0
db/db230901-init.sql

@@ -0,0 +1,393 @@
+-- portal.app_info definition
+
+CREATE TABLE `app_info`
+(
+    `id`              bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `system_name`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用系统名称',
+    `app_type`        int                                                           DEFAULT NULL COMMENT '应用类型字典表(市局系统,区县系统,派出所常用系统,办公综合系统,专项工具)',
+    `system_number`   varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用系统编号',
+    `short_name`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用简称',
+    `dept_name`       varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用事权单位名称',
+    `url`             varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用系统访问地址',
+    `active_flag`     tinyint                                                       DEFAULT NULL COMMENT '系统在用标识(1在用)',
+    `icon`            varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '图标path',
+    `police_category` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '警种分类',
+    `create_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`        tinyint                                                       DEFAULT '0' COMMENT '删除状态 0 有效 1无效 ',
+    `create_user`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人',
+    `version`         varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '版本号',
+    `star`            bigint                                                        DEFAULT '0' COMMENT '收藏数量',
+    `hits`            bigint                                                        DEFAULT '0' COMMENT '点击量',
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE KEY `system_number_unique_code` (`system_number`),
+    KEY               `app_type_dict` (`app_type`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
+
+
+-- portal.external_app definition
+
+CREATE TABLE `external_app`
+(
+    `id`          bigint NOT NULL AUTO_INCREMENT,
+    `designation` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '链接名称',
+    `url`         varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '链接',
+    `create_time` datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
+
+
+-- portal.install_info definition
+
+CREATE TABLE `install_info`
+(
+    `id`          bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `app_id`      bigint                                                       DEFAULT NULL COMMENT '应用程序ID',
+    `business_id` bigint                                                       DEFAULT '0' COMMENT '业务ID',
+    `user_idcard` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户身份证号码',
+    `del_flag`    tinyint                                                      DEFAULT '0' COMMENT '删除状态 默认0 有效 1已卸载',
+    `create_time` datetime                                                     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '安装时间',
+    `update_time` datetime                                                     DEFAULT NULL COMMENT '更新时间',
+    `seq`         int                                                          DEFAULT '0' COMMENT '排序',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY           `install_app_id` (`app_id`) USING BTREE,
+    KEY           `install_app_idcrad_fk` (`user_idcard`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=170 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
+
+
+-- portal.issue_info definition
+
+CREATE TABLE `issue_info`
+(
+    `id`                 bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `title`              varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '标题',
+    `content`            text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '内容',
+    `answer`             text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '解答',
+    `create_user`        varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '创建人',
+    `create_user_idcard` varchar(18) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci  DEFAULT NULL COMMENT '创建身份证号码',
+    `answer_user`        varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '答疑人',
+    `create_time`        datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`        datetime                                                      DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`           tinyint                                                       DEFAULT '0' COMMENT '删除',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
+
+
+-- portal.message_info definition
+
+CREATE TABLE `message_info`
+(
+    `id`              bigint  NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `message_type`    tinyint NOT NULL COMMENT '信息类型 1 通知公告 2信息交流 3 标准规范 ',
+    `message_level`   tinyint NOT NULL                                              DEFAULT '0' COMMENT '消息等级 默认0, 1紧急',
+    `title`           varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '信息标题',
+    `content`         text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '信息内容',
+    `attachment_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '附件地址',
+    `attachment_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '附近名称',
+    `create_by`       varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci  DEFAULT NULL COMMENT '创建人',
+    `create_user`     varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人姓名',
+    `create_org_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人部门名称',
+    `create_org_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人部门code',
+    `update_by`       varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci  DEFAULT NULL COMMENT '修改人',
+    `update_user`     varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '修改人姓名',
+    `create_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`        tinyint                                                       DEFAULT '0' COMMENT '删除状态 默认0 有效 1无效',
+    `version`         int                                                           DEFAULT '1' COMMENT '版本号',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='信息表';
+
+
+-- portal.message_info_history definition
+
+CREATE TABLE `message_info_history`
+(
+    `id`              bigint  NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `info_type`       tinyint NOT NULL COMMENT '信息类型 1 通知公告 2信息交流 3 标准规范 ',
+    `title`           varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '信息标题',
+    `content`         text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '信息内容',
+    `attachment_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '附件地址',
+    `create_by`       varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci  DEFAULT NULL COMMENT '创建人',
+    `create_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='信息变更历史表';
+
+
+-- portal.message_info_scope definition
+
+CREATE TABLE `message_info_scope`
+(
+    `id`              bigint                                                       NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `message_info_id` bigint                                                        DEFAULT NULL COMMENT '信息id',
+    `scope_type`      tinyint                                                      NOT NULL COMMENT '范围类型 1部门 2 人员',
+    `read_status`     tinyint                                                       DEFAULT '0' COMMENT '阅读状态 默认0未读 1已读',
+    `member_id`       varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人员id',
+    `scope_id`        varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '部门id ',
+    `scope_name`      varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '部门名称',
+    `scope_level`     int                                                           DEFAULT NULL COMMENT '范围级别',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=137 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='信息范围表';
+
+
+-- portal.msg_record definition
+
+CREATE TABLE `msg_record`
+(
+    `id`          bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `type`        tinyint                                                       DEFAULT NULL COMMENT '1 信息 2 消息通知',
+    `req_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '信息内容',
+    `create_by`   varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  DEFAULT NULL COMMENT '创建人',
+    `create_user` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人姓名',
+    `create_time` datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `del_flag`    tinyint                                                       DEFAULT '0' COMMENT '删除状态 默认0 有效 1无效',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=98 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='消息信息原始记录表';
+
+
+-- portal.notice_info definition
+
+CREATE TABLE `notice_info`
+(
+    `id`              bigint  NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `message_type`    tinyint NOT NULL COMMENT '消息类型 4 任务类 5 通知类 6 超期提醒类',
+    `message_level`   tinyint NOT NULL                                              DEFAULT '0' COMMENT '消息等级 默认0, 1紧急',
+    `title`           varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '消息标题',
+    `content`         text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '消息内容',
+    `attachment_path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '附件地址',
+    `create_by`       varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci  DEFAULT NULL COMMENT '创建人',
+    `create_user`     varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人姓名',
+    `create_org_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人部门code',
+    `create_org_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人部门名称',
+    `scope_id`        varchar(100)                                                  DEFAULT NULL COMMENT '范围id',
+    `scope_url`       varchar(100)                                                  DEFAULT NULL COMMENT '范围url',
+    `scope_name`      varchar(100)                                                  DEFAULT NULL COMMENT '范围名称',
+    `update_by`       varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci  DEFAULT NULL COMMENT '修改人',
+    `update_user`     varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '修改人姓名',
+    `create_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`        tinyint                                                       DEFAULT '0' COMMENT '删除状态 默认0 有效 1无效',
+    `version`         int                                                           DEFAULT '1' COMMENT '版本号',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='消息表';
+
+
+-- portal.notice_info_scope definition
+
+CREATE TABLE `notice_info_scope`
+(
+    `id`             bigint                                                       NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `notice_info_id` bigint                                                       NOT NULL COMMENT '消息id',
+    `member_id`      varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人员id',
+    `read_status`    tinyint                                                       DEFAULT '0' COMMENT '阅读状态 默认0未读 1已读',
+    `scope_type`     tinyint                                                      NOT NULL COMMENT '范围类型 1部门 2 人员 3 应用',
+    `scope_id`       varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '范围id ',
+    `scope_name`     varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '部门名称',
+    `scope_level`    int                                                           DEFAULT NULL COMMENT '范围级别',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='消息通知范围表';
+
+
+-- portal.sys_dept definition
+
+CREATE TABLE `sys_dept`
+(
+    `org_code`    varchar(12) NOT NULL,
+    `up_org_code` varchar(12)  DEFAULT NULL,
+    `org_kind`    varchar(2)   DEFAULT NULL,
+    `full_name`   varchar(100) DEFAULT NULL,
+    `short_name`  varchar(100) DEFAULT NULL,
+    `area_code`   varchar(6)   DEFAULT NULL,
+    `stand_code`  varchar(12)  DEFAULT NULL,
+    `org_type`    varchar(2)   DEFAULT NULL,
+    `org_level`   varchar(2)   DEFAULT NULL,
+    `org_rank`    varchar(10)  DEFAULT NULL,
+    `unit_class`  varchar(20)  DEFAULT NULL,
+    `email`       varchar(30)  DEFAULT NULL,
+    `link_man`    varchar(20)  DEFAULT NULL,
+    `phone`       varchar(20)  DEFAULT NULL,
+    `update_time` varchar(20)  DEFAULT NULL,
+    `deleted`     varchar(1)   DEFAULT NULL,
+    PRIMARY KEY (`org_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='部门表';
+
+
+-- portal.sys_dict definition
+
+CREATE TABLE `sys_dict`
+(
+    `id`          int      NOT NULL AUTO_INCREMENT COMMENT '编号',
+    `type`        varchar(100)      DEFAULT NULL,
+    `description` varchar(100)      DEFAULT NULL,
+    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `remarks`     varchar(255)      DEFAULT NULL,
+    `del_flag`    char(1)           DEFAULT '0',
+    `tenant_id`   int      NOT NULL DEFAULT '0' COMMENT '所属租户',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY           `sys_dict_del_flag` (`del_flag`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='字典表';
+
+
+-- portal.sys_dict_item definition
+
+CREATE TABLE `sys_dict_item`
+(
+    `id`          int      NOT NULL AUTO_INCREMENT COMMENT '编号',
+    `dict_id`     int      NOT NULL,
+    `value`       varchar(100)      DEFAULT NULL,
+    `label`       varchar(100)      DEFAULT NULL,
+    `type`        varchar(100)      DEFAULT NULL,
+    `description` varchar(100)      DEFAULT NULL,
+    `sort`        int      NOT NULL DEFAULT '0' COMMENT '排序(升序)',
+    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `remarks`     varchar(4000)     DEFAULT NULL,
+    `del_flag`    char(1)           DEFAULT '0',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY           `sys_dict_value` (`value`) USING BTREE,
+    KEY           `sys_dict_label` (`label`) USING BTREE,
+    KEY           `sys_dict_del_flag` (`del_flag`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='字典项';
+
+
+-- portal.sys_log definition
+
+CREATE TABLE `sys_log`
+(
+    `id`              bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+    `module_name`     varchar(100)                                                  DEFAULT NULL COMMENT '模块名称',
+    `module_type`     varchar(100)                                                  DEFAULT NULL COMMENT '模块类型',
+    `title`           varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '操作名称',
+    `create_by`       varchar(30)                                                   DEFAULT NULL,
+    `create_user`     varchar(255)                                                  DEFAULT NULL,
+    `create_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `sys_number`      varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '操作编码',
+    `create_org_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人部门名称',
+    `create_org_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人部门code',
+    `update_time`     datetime                                                      DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `remote_addr`     varchar(255)                                                  DEFAULT NULL,
+    `user_agent`      varchar(1000)                                                 DEFAULT NULL,
+    `request_uri`     varchar(255)                                                  DEFAULT NULL,
+    `method`          varchar(10)                                                   DEFAULT NULL,
+    `params`          text,
+    `time`            mediumtext CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '执行时间',
+    `del_flag`        char(1)                                                       DEFAULT '0',
+    `exception`       text COMMENT '异常信息',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY               `sys_log_create_by` (`create_by`) USING BTREE,
+    KEY               `sys_log_request_uri` (`request_uri`) USING BTREE,
+    KEY               `sys_log_create_date` (`create_time`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1747855 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='日志表';
+
+
+-- portal.sys_menu definition
+
+CREATE TABLE `sys_menu`
+(
+    `menu_code`   varchar(20) NOT NULL,
+    `menu_name`   varchar(50) DEFAULT NULL,
+    `parent_code` varchar(20) DEFAULT NULL,
+    PRIMARY KEY (`menu_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='菜单信息表';
+
+
+-- portal.sys_role definition
+
+CREATE TABLE `sys_role`
+(
+    `role_code` varchar(20) NOT NULL,
+    `role_name` varchar(30) NOT NULL,
+    PRIMARY KEY (`role_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色信息表';
+
+
+-- portal.sys_user definition
+
+CREATE TABLE `sys_user`
+(
+    `idcard`          varchar(18) NOT NULL,
+    `name`            varchar(30)  DEFAULT NULL,
+    `police_number`   varchar(10)  DEFAULT NULL,
+    `org_code`        varchar(12)  DEFAULT NULL,
+    `org_name`        varchar(100) DEFAULT NULL,
+    `user_type`       varchar(2)   DEFAULT NULL,
+    `deleted`         char(1)      DEFAULT NULL,
+    `update_time`     varchar(20)  DEFAULT NULL,
+    `rank`            varchar(10)  DEFAULT NULL,
+    `title`           varchar(50)  DEFAULT NULL,
+    `man_type`        varchar(2)   DEFAULT NULL,
+    `police_category` varchar(10)  DEFAULT NULL,
+    `police_business` varchar(20)  DEFAULT NULL,
+    `sex`             varchar(1)   DEFAULT NULL,
+    `birth`           varchar(8)   DEFAULT NULL,
+    `nation`          varchar(3)   DEFAULT NULL,
+    `address`         varchar(100) DEFAULT NULL,
+    `phone`           varchar(20)  DEFAULT NULL,
+    `mobile_work`     varchar(20)  DEFAULT NULL,
+    `mobile_private`  varchar(20)  DEFAULT NULL,
+    `qq_account`      varchar(20)  DEFAULT NULL,
+    `email`           varchar(30)  DEFAULT NULL,
+    `wx_account`      varchar(20)  DEFAULT NULL,
+    `post_type`       varchar(20)  DEFAULT NULL,
+    `job_type`        varchar(20)  DEFAULT NULL,
+    PRIMARY KEY (`idcard`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户信息表';
+
+
+-- portal.sys_user_menu definition
+
+CREATE TABLE `sys_user_menu`
+(
+    `id`        int         NOT NULL AUTO_INCREMENT,
+    `menu_code` varchar(255) DEFAULT NULL,
+    `idcard`    varchar(18) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户信息表';
+
+
+-- portal.business_info definition
+
+CREATE TABLE `business_info`
+(
+    `id`              bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `business_name`   varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '业务名称',
+    `business_type`   int                                                           DEFAULT NULL COMMENT '业务类型(字典表-business_type)',
+    `business_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '业务代码',
+    `app_id`          bigint                                                        DEFAULT NULL COMMENT '应用ID',
+    `app_name`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '所属应用名称',
+    `url`             varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '业务访问地址',
+    `active_flag`     tinyint                                                       DEFAULT '1' COMMENT '系统在用标识(1在用)',
+    `create_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`     datetime                                                      DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`        tinyint                                                       DEFAULT '0' COMMENT '删除状态 0 有效 1无效',
+    `create_user`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人',
+    `star`            bigint                                                        DEFAULT '0' COMMENT '收藏数量',
+    `hits`            bigint                                                        DEFAULT '0' COMMENT '点击量',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY               `business_type_dict` (`business_type`) USING BTREE,
+    KEY               `business_appid_appinfo` (`app_id`) USING BTREE,
+    CONSTRAINT `business_appid_appinfo` FOREIGN KEY (`app_id`) REFERENCES `app_info` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+    CONSTRAINT `business_info_FK` FOREIGN KEY (`business_type`) REFERENCES `sys_dict_item` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
+
+
+-- portal.file_info definition
+
+CREATE TABLE `file_info`
+(
+    `id`           bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `file_name`    varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '文件名',
+    `url`          varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '路径',
+    `type`         int                                                           DEFAULT NULL COMMENT '文件类型(办公常用,系统工具......)',
+    `extension`    varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '拓展名',
+    `size`         bigint                                                        DEFAULT NULL COMMENT '文件大小',
+    `content_type` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'ContentType',
+    `downloads`    bigint                                                        DEFAULT '0' COMMENT '下载量',
+    `create_time`  datetime                                                      DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
+    `update_time`  datetime                                                      DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`     tinyint                                                       DEFAULT '0' COMMENT '删除',
+    `create_user`  varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '上传人',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY            `file_type_id_fk` (`type`) USING BTREE,
+    CONSTRAINT `file_info_FK` FOREIGN KEY (`type`) REFERENCES `sys_dict_item` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;

+ 0 - 0
db/db230902-initData.sql


+ 2 - 0
db/db240716-addAppKeyAndSecret.sql

@@ -0,0 +1,2 @@
+ALTER TABLE portal.app_info ADD app_key varchar(32) NULL;
+ALTER TABLE portal.app_info ADD app_secret varchar(32) NULL;

+ 36 - 0
db/db240817-addCommentTable.sql

@@ -0,0 +1,36 @@
+-- portal.comment_info definition
+
+CREATE TABLE `comment_info`
+(
+    `id`                 bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `content`            text COMMENT '内容',
+    `create_user_idcard` varchar(18)  DEFAULT NULL COMMENT '创建人身份证号',
+    `create_user`        varchar(255) DEFAULT NULL COMMENT '创建人',
+    `create_org_code`    varchar(20)  DEFAULT NULL COMMENT '创建人部门code',
+    `create_org_name`    varchar(100) DEFAULT NULL COMMENT '创建人部门名称',
+    `create_time`        datetime     DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`        datetime     DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`           tinyint      DEFAULT '0' COMMENT '删除',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY                  `idx_comment_info_create_user_idcard` (`create_user_idcard`) USING BTREE,
+    KEY                  `idx_comment_info_del_flag` (`del_flag`) USING BTREE
+);
+
+-- portal.comment_detail_info definition
+
+CREATE TABLE `comment_detail_info`
+(
+    `id`                 bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `comment_id`         bigint NOT NULL COMMENT '主键ID',
+    `content`            text COMMENT '内容',
+    `create_user_idcard` varchar(18)  DEFAULT NULL COMMENT '创建人身份证号',
+    `create_user`        varchar(255) DEFAULT NULL COMMENT '创建人',
+    `create_org_code`    varchar(20)  DEFAULT NULL COMMENT '创建人部门code',
+    `create_org_name`    varchar(100) DEFAULT NULL COMMENT '创建人部门名称',
+    `create_time`        datetime     DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`        datetime     DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `del_flag`           tinyint      DEFAULT '0' COMMENT '删除',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY                  `idx_comment_detail_info_comment_id` (`comment_id`) USING BTREE,
+    KEY                  `idx_comment_detail_info_del_flag` (`del_flag`) USING BTREE
+);

+ 10 - 0
db/db240818-addFloatingWindow.sql

@@ -0,0 +1,10 @@
+-- portal.tip_info definition
+
+CREATE TABLE `tip_info`
+(
+    `id`          bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `content`     text COMMENT '内容',
+    `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE,
+    KEY           `idx_tip_info_create_time` (`create_time`) USING BTREE
+) COMMENT='飘窗信息';

+ 32 - 8
pom.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
@@ -16,6 +16,7 @@
     <properties>
         <java.version>1.8</java.version>
         <mapstruct.version>1.5.2.Final</mapstruct.version>
+        <redisson.version>3.33.0</redisson.version>
     </properties>
     <dependencies>
         <!--tomcat-->
@@ -130,11 +131,7 @@
         </dependency>
 
         <!--redis start-->
-        <dependency>
-            <groupId>org.springframework.data</groupId>
-            <artifactId>spring-data-redis</artifactId>
-        </dependency>
-        <!--缓存依赖-->
+        <!-- USE lettuce -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
@@ -143,6 +140,30 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>
         </dependency>
+
+
+        <!-- OR USE redisson -->
+        <!-- <dependency> -->
+        <!--     <groupId>org.redisson</groupId> -->
+        <!--     <artifactId>redisson-spring-boot-starter</artifactId> -->
+        <!--     <version>${redisson.version}</version> -->
+        <!--     <exclusions> -->
+        <!--         <exclusion> -->
+        <!--             <groupId>org.redisson</groupId> -->
+        <!--             <artifactId>redisson-spring-data-33</artifactId> -->
+        <!--         </exclusion> -->
+        <!--         <exclusion> -->
+        <!--             <groupId>org.springframework.boot</groupId> -->
+        <!--             <artifactId>spring-boot-starter-actuator</artifactId> -->
+        <!--         </exclusion> -->
+        <!--     </exclusions> -->
+        <!-- </dependency> -->
+        <!-- <dependency> -->
+        <!--     <groupId>org.redisson</groupId> -->
+        <!--     <artifactId>redisson-spring-data-27</artifactId> -->
+        <!--     <version>${redisson.version}</version> -->
+        <!-- </dependency> -->
+
         <!--redis end -->
 
         <!--apache-commons-->
@@ -229,8 +250,6 @@
             <version>2.0.6</version>
         </dependency>
 
-
-
     </dependencies>
 
     <build>
@@ -272,6 +291,11 @@
                 </configuration>
             </plugin>
 
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+            </plugin>
+
         </plugins>
     </build>
 

+ 5 - 0
src/main/java/com/dragon/tj/portal/PortalServiceApplication.java

@@ -1,9 +1,14 @@
 package com.dragon.tj.portal;
 
+import com.dragon.tj.portal.auth.properties.AppProperties;
+import com.dragon.tj.portal.auth.properties.CasProperties;
+import com.dragon.tj.portal.auth.properties.ZeroTrustProperties;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 
 @SpringBootApplication
+@EnableConfigurationProperties({AppProperties.class, CasProperties.class, ZeroTrustProperties.class})
 public class PortalServiceApplication {
 
     public static void main(String[] args) {

+ 6 - 0
src/main/java/com/dragon/tj/portal/auth/common/constants/AuthType.java

@@ -0,0 +1,6 @@
+package com.dragon.tj.portal.auth.common.constants;
+
+public interface AuthType {
+    String CAS = "cas";
+    String ZERO_TRUST = "zeroTrust";
+}

+ 6 - 0
src/main/java/com/dragon/tj/portal/auth/common/constants/Role.java

@@ -0,0 +1,6 @@
+package com.dragon.tj.portal.auth.common.constants;
+
+public interface Role {
+    String ADMIN = "ADMIN";
+    String GZT = "gzt";
+}

+ 42 - 0
src/main/java/com/dragon/tj/portal/auth/config/RetrofitCasConfig.java

@@ -0,0 +1,42 @@
+package com.dragon.tj.portal.auth.config;
+
+import com.alibaba.fastjson.support.retrofit.Retrofit2ConverterFactory;
+import com.dragon.tj.portal.auth.module.cas.CasAuthenticationClient;
+import com.dragon.tj.portal.auth.module.cas.CasAuthorizationClient;
+import com.dragon.tj.portal.auth.properties.CasProperties;
+import okhttp3.OkHttpClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import retrofit2.Retrofit;
+import retrofit2.converter.jackson.JacksonConverterFactory;
+
+@Configuration
+public class RetrofitCasConfig {
+
+    private final CasProperties casProperties;
+
+    public RetrofitCasConfig(CasProperties casProperties) {
+        this.casProperties = casProperties;
+    }
+
+    @Bean
+    public CasAuthenticationClient casAuthenticationClient(OkHttpClient okHttpClient) {
+        Retrofit retrofit = new Retrofit.Builder()
+                .client(okHttpClient)
+                .baseUrl(casProperties.getAuthenticationUrl())
+                .addConverterFactory(JacksonConverterFactory.create())
+                .build();
+        return retrofit.create(CasAuthenticationClient.class);
+    }
+
+    @Bean
+    public CasAuthorizationClient casAuthorizationClient(OkHttpClient okHttpClient) {
+        Retrofit retrofit = new Retrofit.Builder()
+                .client(okHttpClient)
+                .baseUrl(casProperties.getAuthorizeUrl())
+                .addConverterFactory(Retrofit2ConverterFactory.create())
+                .build();
+        return retrofit.create(CasAuthorizationClient.class);
+    }
+
+}

+ 5 - 31
src/main/java/com/dragon/tj/portal/auth/config/RetrofitConfig.java

@@ -1,27 +1,18 @@
 package com.dragon.tj.portal.auth.config;
 
-import com.alibaba.fastjson.support.retrofit.Retrofit2ConverterFactory;
-import com.dragon.tj.portal.auth.client.DcucAuthClient;
-import com.dragon.tj.portal.auth.client.DcucUserClient;
+import com.dragon.tj.portal.auth.util.SSLSocketManager;
 import okhttp3.OkHttpClient;
 import okhttp3.logging.HttpLoggingInterceptor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import retrofit2.Retrofit;
-import retrofit2.converter.jackson.JacksonConverterFactory;
 
 import java.util.concurrent.TimeUnit;
 
 @Configuration
 public class RetrofitConfig {
-    @Value("${client.dcuc.user.url}")
-    private String dcucUserUrl;
 
-    @Value("${client.dcuc.auth.url}")
-    private String dcucAuthUrl;
-
-    @Value("${client.log.enabled:false}")
+    @Value("${okhttp.log.enabled:false}")
     private boolean logEnabled;
 
     @Bean
@@ -35,26 +26,9 @@ public class RetrofitConfig {
         if (logEnabled) {
             httpClientBuilder.addInterceptor(loggingInterceptor);
         }
-        return httpClientBuilder.build();
-    }
-
-    @Bean
-    public DcucUserClient dcucUserClient(OkHttpClient okHttpClient) {
-        Retrofit retrofit = new Retrofit.Builder()
-                .client(okHttpClient)
-                .baseUrl(dcucUserUrl)
-                .addConverterFactory(JacksonConverterFactory.create())
-                .build();
-        return retrofit.create(DcucUserClient.class);
-    }
 
-    @Bean
-    public DcucAuthClient dcucAuthClient() {
-        Retrofit retrofit = new Retrofit.Builder()
-                .client(okHttpClient())
-                .baseUrl(dcucAuthUrl)
-                .addConverterFactory(Retrofit2ConverterFactory.create())
-                .build();
-        return retrofit.create(DcucAuthClient.class);
+        httpClientBuilder.sslSocketFactory(SSLSocketManager.getSSLSocketFactory(), SSLSocketManager.getTrustManager());
+        httpClientBuilder.hostnameVerifier(SSLSocketManager.getHostNameVerifier());
+        return httpClientBuilder.build();
     }
 }

+ 41 - 0
src/main/java/com/dragon/tj/portal/auth/config/RetrofitZeroTrustConfig.java

@@ -0,0 +1,41 @@
+package com.dragon.tj.portal.auth.config;
+
+import com.alibaba.fastjson.support.retrofit.Retrofit2ConverterFactory;
+import com.dragon.tj.portal.auth.module.zerotrust.ZeroTrustAuthenticationClient;
+import com.dragon.tj.portal.auth.module.zerotrust.ZeroTrustAuthorizeClient;
+import com.dragon.tj.portal.auth.properties.ZeroTrustProperties;
+import okhttp3.OkHttpClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import retrofit2.Retrofit;
+
+@Configuration
+public class RetrofitZeroTrustConfig {
+
+    private final ZeroTrustProperties zeroTrustProperties;
+
+    public RetrofitZeroTrustConfig(ZeroTrustProperties zeroTrustProperties) {
+        this.zeroTrustProperties = zeroTrustProperties;
+    }
+
+    @Bean
+    public ZeroTrustAuthenticationClient zeroTrustAuthenticationClient(OkHttpClient okHttpClient) {
+        Retrofit retrofit = new Retrofit.Builder()
+                .client(okHttpClient)
+                .baseUrl(zeroTrustProperties.getAuthenticationUrl())
+                .addConverterFactory(Retrofit2ConverterFactory.create())
+                .build();
+        return retrofit.create(ZeroTrustAuthenticationClient.class);
+    }
+
+    @Bean
+    public ZeroTrustAuthorizeClient zeroTrustAuthorizeClient(OkHttpClient okHttpClient) {
+        Retrofit retrofit = new Retrofit.Builder()
+                .client(okHttpClient)
+                .baseUrl(zeroTrustProperties.getAuthorizeUrl())
+                .addConverterFactory(Retrofit2ConverterFactory.create())
+                .build();
+        return retrofit.create(ZeroTrustAuthorizeClient.class);
+    }
+
+}

+ 125 - 0
src/main/java/com/dragon/tj/portal/auth/config/WebSecurityCasConfig.java

@@ -0,0 +1,125 @@
+package com.dragon.tj.portal.auth.config;
+
+import com.dragon.tj.portal.auth.common.constants.AuthType;
+import com.dragon.tj.portal.auth.module.cas.MyCasAuthenticationEntryPoint;
+import com.dragon.tj.portal.auth.module.cas.MySimpleUrlAuthenticationSuccessHandler;
+import com.dragon.tj.portal.auth.properties.AppProperties;
+import com.dragon.tj.portal.auth.properties.CasProperties;
+import com.dragon.tj.portal.auth.service.JwtTokenAuthenticationFilter;
+import com.dragon.tj.portal.auth.service.JwtTokenLogoutSuccessHandler;
+import com.dragon.tj.portal.auth.service.MyUserDetailsByNameServiceWrapper;
+import com.dragon.tj.portal.auth.service.MyUserDetailsService;
+import com.dragon.tj.portal.auth.service.TokenService;
+import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;
+import org.jasig.cas.client.validation.TicketValidator;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.cas.ServiceProperties;
+import org.springframework.security.cas.authentication.CasAuthenticationProvider;
+import org.springframework.security.cas.web.CasAuthenticationFilter;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+
+@Configuration
+@ConditionalOnProperty(name = "app.auth-type", havingValue = AuthType.CAS, matchIfMissing = true)
+@EnableConfigurationProperties(CasProperties.class)
+public class WebSecurityCasConfig {
+
+    private final AppProperties appProperties;
+    private final CasProperties casProperties;
+    private final JwtTokenAuthenticationFilter jwtTokenAuthenticationFilter;
+    private final MyUserDetailsService userDetailsService;
+    private final MySimpleUrlAuthenticationSuccessHandler mySimpleUrlAuthenticationSuccessHandler;
+    private final TokenService tokenService;
+
+    public WebSecurityCasConfig(
+            AppProperties appProperties, CasProperties casProperties,
+            JwtTokenAuthenticationFilter jwtTokenAuthenticationFilter,
+            MyUserDetailsService userDetailsService,
+            MySimpleUrlAuthenticationSuccessHandler mySimpleUrlAuthenticationSuccessHandler,
+            TokenService tokenService) {
+        this.appProperties = appProperties;
+        this.casProperties = casProperties;
+        this.jwtTokenAuthenticationFilter = jwtTokenAuthenticationFilter;
+        this.userDetailsService = userDetailsService;
+        this.mySimpleUrlAuthenticationSuccessHandler = mySimpleUrlAuthenticationSuccessHandler;
+        this.tokenService = tokenService;
+    }
+
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        http
+                // CSRF禁用,因为不使用session
+                .csrf().disable()
+                // Enable CORS
+                .cors()
+                .and()
+                .authorizeRequests()
+                .antMatchers(WebSecurityConfig.WHITE_LIST.toArray(new String[0])).permitAll()
+                .anyRequest().authenticated()
+                .and()
+                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+                .and()
+                // 因为CasAuthenticationFilter仅拦截/sso/login,所以未认证前访问其他url失败时都走到这个兜底的exception处理
+                .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(authenticationEntryPoint()))
+                // CAS SSO
+                .addFilter(casAuthenticationFilter())
+                .addFilterBefore(jwtTokenAuthenticationFilter, CasAuthenticationFilter.class)
+                .logout()
+                .logoutUrl(appProperties.getLogoutUrl())
+                .logoutSuccessHandler(jwtTokenLogoutSuccessHandler());
+        return http.build();
+    }
+
+    public AuthenticationEntryPoint authenticationEntryPoint() {
+        MyCasAuthenticationEntryPoint casAuthenticationEntryPoint = new MyCasAuthenticationEntryPoint();
+        casAuthenticationEntryPoint.setLoginUrl(casProperties.getLoginUrl());
+        casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
+        return casAuthenticationEntryPoint;
+    }
+
+    public CasAuthenticationFilter casAuthenticationFilter() {
+        CasAuthenticationFilter filter = new CasAuthenticationFilter();
+        filter.setFilterProcessesUrl(appProperties.getFilterUrl());
+
+        CasAuthenticationProvider casAuthenticationProvider = casAuthenticationProvider(userDetailsService);
+        filter.setAuthenticationManager(new ProviderManager(casAuthenticationProvider));
+
+        mySimpleUrlAuthenticationSuccessHandler.setDefaultTargetUrl(appProperties.getTargetUrl());
+        filter.setAuthenticationSuccessHandler(mySimpleUrlAuthenticationSuccessHandler);
+        filter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler(appProperties.getFailureUrl()));
+
+        return filter;
+    }
+
+    public CasAuthenticationProvider casAuthenticationProvider(UserDetailsService userDetailsService) {
+        CasAuthenticationProvider provider = new CasAuthenticationProvider();
+        provider.setAuthenticationUserDetailsService(new MyUserDetailsByNameServiceWrapper<>(userDetailsService));
+        provider.setServiceProperties(serviceProperties());
+        provider.setTicketValidator(ticketValidator());
+        provider.setKey("key");
+        return provider;
+    }
+
+    public ServiceProperties serviceProperties() {
+        ServiceProperties serviceProperties = new ServiceProperties();
+        serviceProperties.setService(appProperties.getServiceUrl());
+        return serviceProperties;
+    }
+
+    private TicketValidator ticketValidator() {
+        return new Cas20ServiceTicketValidator(casProperties.getBaseUrl());
+    }
+
+    public JwtTokenLogoutSuccessHandler jwtTokenLogoutSuccessHandler() {
+        return new JwtTokenLogoutSuccessHandler(appProperties.getHomeUrl(), casProperties.getLogoutUrl(), tokenService);
+    }
+
+}

+ 46 - 111
src/main/java/com/dragon/tj/portal/auth/config/WebSecurityConfig.java

@@ -1,150 +1,85 @@
 package com.dragon.tj.portal.auth.config;
 
-import com.dragon.tj.portal.auth.service.*;
-import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;
-import org.jasig.cas.client.validation.TicketValidator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
+import com.dragon.tj.portal.auth.module.hmac.HmacAuthenticationFilter;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.ProviderManager;
-import org.springframework.security.cas.ServiceProperties;
-import org.springframework.security.cas.authentication.CasAuthenticationProvider;
-import org.springframework.security.cas.web.CasAuthenticationFilter;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
+import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer;
 import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.web.AuthenticationEntryPoint;
 import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.security.web.authentication.AuthenticationEntryPointFailureHandler;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
 
 @Configuration
 @EnableWebSecurity
 public class WebSecurityConfig {
-    @Value("${cas.base.url}")
-    private String casBaseUrl;
-
-    @Value("${cas.login.url}")
-    private String casLoginUrl;
-
-    @Value("${app.logout.url}")
-    private String appLogoutUrl;
-
-    @Value("${cas.service.url}")
-    private String casServiceUrl;
-
-    @Value("${cas.filter.url}")
-    private String casFilterUrl;
-
-    @Value("${cas.target.url}")
-    private String casTargetUrl;
 
-    @Value("${cas.failure.url}")
-    private String casFailureUrl;
+    public static final List<String> WHITE_LIST;
 
-    @Autowired
-    private ServletWebServerApplicationContext context;
-
-    @Autowired
-    private JwtTokenAuthenticationFilter jwtTokenAuthenticationFilter;
-    @Autowired
-    private MyUserDetailsService userDetailsService;
-    @Autowired
-    private MySimpleUrlAuthenticationSuccessHandler mySimpleUrlAuthenticationSuccessHandler;
-    @Autowired
-    private JwtTokenLogoutSuccessHandler logoutSuccessHandler;
+    static {
+        // 白名单
+        WHITE_LIST = new ArrayList<>();
+        WHITE_LIST.add("/test/login");
+        WHITE_LIST.add("/file/**");
+    }
 
-    private static StringBuilder whiteList = new StringBuilder();
-    private static String whiteListSplit = ",";
+    private final JdbcTemplate jdbcTemplate;
 
-    /**
-     *
-     *白名单
-     */
-    static {
-        whiteList.append("/test/login" + whiteListSplit);
-        whiteList.append("/file/**" + whiteListSplit);
+    public WebSecurityConfig(JdbcTemplate jdbcTemplate) {
+        this.jdbcTemplate = jdbcTemplate;
     }
 
     @Bean
     public WebSecurityCustomizer webSecurityCustomizer() {
-
         return (web) -> web.ignoring()
                 // 认证成功后才会忽略
                 .antMatchers("/resources/**");
     }
 
-
     @Bean
-    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+    public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception {
         http
+                .antMatcher("/api/**")
                 // CSRF禁用,因为不使用session
-                .csrf().disable().cors()
-                .and()
-                .authorizeRequests()
-                .antMatchers(whiteList.toString().split(whiteListSplit)).permitAll()
-                .anyRequest().authenticated()
-                .and()
-                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
-                .and()
-                .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(authenticationEntryPoint()))
-                .addFilter(casAuthenticationFilter())
-                .addFilterBefore(jwtTokenAuthenticationFilter, CasAuthenticationFilter.class)
-                // .addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class)
-                .logout()
-                .logoutUrl(appLogoutUrl)
-                .logoutSuccessHandler(logoutSuccessHandler);
+                .csrf(CsrfConfigurer::disable)
+                .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated())
+                .sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+                // hmacFilter情况下大概率用不到这个exceptionHandling
+                .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(apiAuthenticationEntryPoint()))
+                // 内置filters已经排序 FilterOrderRegistration.FilterOrderRegistration()
+                .addFilterBefore(hmacAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
         return http.build();
     }
 
-    public AuthenticationEntryPoint authenticationEntryPoint() {
-        MyCasAuthenticationEntryPoint casAuthenticationEntryPoint = new MyCasAuthenticationEntryPoint();
-        casAuthenticationEntryPoint.setLoginUrl(this.casLoginUrl);
-        casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
-        return casAuthenticationEntryPoint;
+    public AuthenticationEntryPoint apiAuthenticationEntryPoint() {
+        return (request, response, authException) -> {
+            response.setStatus(HttpStatus.UNAUTHORIZED.value());
+            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
+            response.setContentType(MediaType.APPLICATION_JSON.toString());
+            response.getWriter().write("{\"msg:\":\"认证失败:" + authException.getMessage() + "\"}");
+        };
     }
 
-    public CasAuthenticationFilter casAuthenticationFilter() {
-        CasAuthenticationFilter filter = new CasAuthenticationFilter();
-        filter.setFilterProcessesUrl(casFilterUrl);
-        filter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler(casFailureUrl));
-
-        CasAuthenticationProvider casAuthenticationProvider = casAuthenticationProvider(userDetailsService);
-        filter.setAuthenticationManager(new ProviderManager(casAuthenticationProvider));
-
-        mySimpleUrlAuthenticationSuccessHandler.setDefaultTargetUrl(casTargetUrl);
-        filter.setAuthenticationSuccessHandler(mySimpleUrlAuthenticationSuccessHandler);
-
+    public HmacAuthenticationFilter hmacAuthenticationFilter() {
+        // HmacAuthenticationFilter filter = new HmacAuthenticationFilter("/api/token");
+        HmacAuthenticationFilter filter = new HmacAuthenticationFilter("/api/**");
+        filter.setJdbcTemplate(jdbcTemplate);
+        filter.setAuthenticationFailureHandler(new AuthenticationEntryPointFailureHandler(apiAuthenticationEntryPoint()));
+        filter.setAuthenticationSuccessHandler((request, response, authentication) ->
+                SecurityContextHolder.getContext().setAuthentication(authentication)
+        );
         return filter;
     }
 
-    public CasAuthenticationProvider casAuthenticationProvider(UserDetailsService userDetailsService) {
-        CasAuthenticationProvider provider = new CasAuthenticationProvider();
-        provider.setAuthenticationUserDetailsService(new MyUserDetailsByNameServiceWrapper<>(userDetailsService));
-        provider.setServiceProperties(serviceProperties());
-        provider.setTicketValidator(ticketValidator());
-        provider.setKey("key");
-        return provider;
-    }
-
-    public ServiceProperties serviceProperties() {
-        ServiceProperties serviceProperties = new ServiceProperties();
-        serviceProperties.setService(casServiceUrl);
-        return serviceProperties;
-    }
-
-    private TicketValidator ticketValidator() {
-        return new Cas20ServiceTicketValidator(this.casBaseUrl);
-    }
-
-//    @Bean
-//    public SingleSignOutFilter singleSignOutFilter() {
-//        SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
-//        singleSignOutFilter.setIgnoreInitConfiguration(true);
-//        return singleSignOutFilter;
-//    }
-
 }

+ 105 - 0
src/main/java/com/dragon/tj/portal/auth/config/WebSecurityZeroTrustConfig.java

@@ -0,0 +1,105 @@
+package com.dragon.tj.portal.auth.config;
+
+import com.dragon.tj.portal.auth.common.constants.AuthType;
+import com.dragon.tj.portal.auth.module.cas.MyCasAuthenticationEntryPoint;
+import com.dragon.tj.portal.auth.module.cas.MySimpleUrlAuthenticationSuccessHandler;
+import com.dragon.tj.portal.auth.module.zerotrust.ZeroTrustAuthenticationFilter;
+import com.dragon.tj.portal.auth.module.zerotrust.ZeroTrustAuthenticationProvider;
+import com.dragon.tj.portal.auth.properties.AppProperties;
+import com.dragon.tj.portal.auth.properties.ZeroTrustProperties;
+import com.dragon.tj.portal.auth.service.JwtTokenAuthenticationFilter;
+import com.dragon.tj.portal.auth.service.JwtTokenLogoutSuccessHandler;
+import com.dragon.tj.portal.auth.service.MyUserDetailsService;
+import com.dragon.tj.portal.auth.service.TokenService;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.cas.ServiceProperties;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+@Configuration
+@ConditionalOnProperty(name = "app.auth-type", havingValue = AuthType.ZERO_TRUST)
+@EnableConfigurationProperties(ZeroTrustProperties.class)
+public class WebSecurityZeroTrustConfig {
+
+    private final AppProperties appProperties;
+    private final ZeroTrustProperties zeroTrustProperties;
+    private final JwtTokenAuthenticationFilter jwtTokenAuthenticationFilter;
+    private final MyUserDetailsService userDetailsService;
+    private final MySimpleUrlAuthenticationSuccessHandler mySimpleUrlAuthenticationSuccessHandler;
+    private final TokenService tokenService;
+
+    public WebSecurityZeroTrustConfig(
+            AppProperties appProperties,
+            ZeroTrustProperties zeroTrustProperties,
+            JwtTokenAuthenticationFilter jwtTokenAuthenticationFilter,
+            MyUserDetailsService userDetailsService,
+            MySimpleUrlAuthenticationSuccessHandler mySimpleUrlAuthenticationSuccessHandler,
+            TokenService tokenService) {
+        this.appProperties = appProperties;
+        this.zeroTrustProperties = zeroTrustProperties;
+        this.jwtTokenAuthenticationFilter = jwtTokenAuthenticationFilter;
+        this.userDetailsService = userDetailsService;
+        this.mySimpleUrlAuthenticationSuccessHandler = mySimpleUrlAuthenticationSuccessHandler;
+        this.tokenService = tokenService;
+    }
+
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        http
+                // CSRF禁用,因为不使用session
+                .csrf().disable()
+                // Enable CORS
+                .cors()
+                .and()
+                .authorizeRequests()
+                .antMatchers(WebSecurityConfig.WHITE_LIST.toArray(new String[0])).permitAll()
+                .anyRequest().authenticated()
+                .and()
+                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+                .and()
+                // 因为CasAuthenticationFilter仅拦截/sso/login,所以未认证前访问其他url失败时都走到这个兜底的exception处理
+                .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(authenticationEntryPoint()))
+                // HuaWei Zero Trust
+                .addFilterBefore(jwtTokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
+                .addFilterBefore(zeroTrustAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
+                .logout()
+                .logoutUrl(appProperties.getLogoutUrl())
+                .logoutSuccessHandler(jwtTokenLogoutSuccessHandler());
+        return http.build();
+    }
+
+    public AuthenticationEntryPoint authenticationEntryPoint() {
+        MyCasAuthenticationEntryPoint casAuthenticationEntryPoint = new MyCasAuthenticationEntryPoint();
+        casAuthenticationEntryPoint.setLoginUrl(zeroTrustProperties.getLoginUrl());
+        casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
+        return casAuthenticationEntryPoint;
+    }
+
+    public ServiceProperties serviceProperties() {
+        ServiceProperties serviceProperties = new ServiceProperties();
+        serviceProperties.setService(appProperties.getServiceUrl());
+        return serviceProperties;
+    }
+
+    public ZeroTrustAuthenticationFilter zeroTrustAuthenticationFilter() {
+        ZeroTrustAuthenticationFilter filter = new ZeroTrustAuthenticationFilter(appProperties.getFilterUrl());
+        filter.setAuthenticationManager(new ProviderManager(new ZeroTrustAuthenticationProvider(userDetailsService)));
+        mySimpleUrlAuthenticationSuccessHandler.setDefaultTargetUrl(appProperties.getTargetUrl());
+        filter.setAuthenticationSuccessHandler(mySimpleUrlAuthenticationSuccessHandler);
+        filter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler(appProperties.getFailureUrl()));
+        return filter;
+    }
+
+    public JwtTokenLogoutSuccessHandler jwtTokenLogoutSuccessHandler() {
+        return new JwtTokenLogoutSuccessHandler(appProperties.getHomeUrl(), zeroTrustProperties.getLogoutUrl(), tokenService);
+    }
+
+}

+ 29 - 0
src/main/java/com/dragon/tj/portal/auth/config/WebServletConfig.java

@@ -0,0 +1,29 @@
+package com.dragon.tj.portal.auth.config;
+
+import com.dragon.tj.portal.auth.module.hmac.HmacAuthenticationFilter;
+import com.dragon.tj.portal.auth.service.JwtTokenAuthenticationFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class WebServletConfig {
+
+    /**
+     * 禁用ServletFilterChain中的JwtTokenAuthenticationFilter
+     * 该filter只用于SecurityFilterChain中,禁用以避免执行两次
+     */
+    @Bean
+    public FilterRegistrationBean<JwtTokenAuthenticationFilter> jwtTokenFilterRegistration(JwtTokenAuthenticationFilter filter) {
+        FilterRegistrationBean<JwtTokenAuthenticationFilter> registration = new FilterRegistrationBean<>(filter);
+        registration.setEnabled(false);
+        return registration;
+    }
+
+    // @Bean
+    public FilterRegistrationBean<HmacAuthenticationFilter> hmacFilterRegistration(HmacAuthenticationFilter filter) {
+        FilterRegistrationBean<HmacAuthenticationFilter> registration = new FilterRegistrationBean<>(filter);
+        registration.setEnabled(false);
+        return registration;
+    }
+}

+ 6 - 3
src/main/java/com/dragon/tj/portal/auth/controller/SsoController.java

@@ -18,7 +18,11 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -37,13 +41,12 @@ public class SsoController {
     @Autowired
     private SysUserService sysUserService;
 
-
     @GetMapping("/login")
     public R login(@RequestParam(required = false) String idCard, HttpServletRequest request) {
         if (StringUtils.isBlank(idCard)) {
             idCard = "120222197001010002";
         }
-        SysUser sysUser = sysUserService.getUserById(idCard);
+        SysUser sysUser = sysUserService.getUserByKey(idCard);
         List<String> perms = Arrays.asList("gzt", "yyzx", "ywzx", "xxgl", "rjxz", "rzcx", "cjwt");
         LoginUser loginUser = new LoginUser(sysUser.getIdcard(), sysUser.getOrgCode(), sysUser, new HashSet<>(perms));
         UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());

+ 10 - 3
src/main/java/com/dragon/tj/portal/auth/controller/UserController.java

@@ -20,10 +20,18 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 
 @RestController
 @RequestMapping("/user")
@@ -35,7 +43,6 @@ public class UserController {
     @Value("${external.dcuc.url}")
     private String dcucUrl;
 
-
     @Autowired
     private SysUserService sysUserService;
     @Autowired

+ 23 - 12
src/main/java/com/dragon/tj/portal/auth/model/LoginUser.java

@@ -16,58 +16,53 @@ import java.util.stream.Collectors;
  * @author tienchin
  */
 public class LoginUser implements UserDetails {
-
+    private static final long serialVersionUID = -8692404576335771235L;
+    SysUser user;
     /**
      * 用户idCard
      */
     private String idCard;
-
     /**
      * 部门code
      */
     private String orgCode;
-
     /**
      * 用户唯一标识
      */
     private String token;
-
     /**
      * 登录时间
      */
     private Long loginTime;
-
     /**
      * 过期时间
      */
     private Long expireTime;
-
     /**
      * 登录IP地址
      */
     private String ipaddr;
-
     /**
      * 登录地点
      */
     private String loginLocation;
-
     /**
      * 浏览器类型
      */
     private String browser;
-
     /**
      * 操作系统
      */
     private String os;
-
     /**
      * 权限列表
      */
     private Set<String> permissions;
-
-    SysUser user;
+    /**
+     * HuaWei Zero Trust Required
+     */
+    private String userToken;
+    private String appToken;
 
     public LoginUser(SysUser user, Set<String> permissions) {
         this.user = user;
@@ -206,4 +201,20 @@ public class LoginUser implements UserDetails {
     public void setUser(SysUser user) {
         this.user = user;
     }
+
+    public String getUserToken() {
+        return userToken;
+    }
+
+    public void setUserToken(String userToken) {
+        this.userToken = userToken;
+    }
+
+    public String getAppToken() {
+        return appToken;
+    }
+
+    public void setAppToken(String appToken) {
+        this.appToken = appToken;
+    }
 }

+ 26 - 0
src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthenticationMsg.java

@@ -0,0 +1,26 @@
+package com.dragon.tj.portal.auth.model.zeroTrust;
+
+import java.io.Serializable;
+
+public class AuthenticationMsg implements Serializable {
+    private static final long serialVersionUID = 5219010289324571546L;
+
+    private String code;
+    private String info;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public void setInfo(String info) {
+        this.info = info;
+    }
+}

+ 35 - 0
src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthenticationResponse.java

@@ -0,0 +1,35 @@
+package com.dragon.tj.portal.auth.model.zeroTrust;
+
+import java.io.Serializable;
+
+public class AuthenticationResponse implements Serializable {
+    public static final String SUCCESS = "successed";
+    private static final long serialVersionUID = -8244370439799252224L;
+    private String tag;
+    private AuthenticationMsg msg;
+    private AuthenticationResult result;
+
+    public String getTag() {
+        return tag;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    public AuthenticationMsg getMsg() {
+        return msg;
+    }
+
+    public void setMsg(AuthenticationMsg msg) {
+        this.msg = msg;
+    }
+
+    public AuthenticationResult getResult() {
+        return result;
+    }
+
+    public void setResult(AuthenticationResult result) {
+        this.result = result;
+    }
+}

+ 71 - 0
src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthenticationResult.java

@@ -0,0 +1,71 @@
+package com.dragon.tj.portal.auth.model.zeroTrust;
+
+import java.io.Serializable;
+
+public class AuthenticationResult implements Serializable {
+    private static final long serialVersionUID = -8244370439799252224L;
+
+    private String yhId;
+    private String xm;
+    private String jh;
+    private String sfzh;
+    private String dwdm;
+    private String dwmc;
+    private String zw;
+
+    public String getYhId() {
+        return yhId;
+    }
+
+    public void setYhId(String yhId) {
+        this.yhId = yhId;
+    }
+
+    public String getXm() {
+        return xm;
+    }
+
+    public void setXm(String xm) {
+        this.xm = xm;
+    }
+
+    public String getJh() {
+        return jh;
+    }
+
+    public void setJh(String jh) {
+        this.jh = jh;
+    }
+
+    public String getSfzh() {
+        return sfzh;
+    }
+
+    public void setSfzh(String sfzh) {
+        this.sfzh = sfzh;
+    }
+
+    public String getDwdm() {
+        return dwdm;
+    }
+
+    public void setDwdm(String dwdm) {
+        this.dwdm = dwdm;
+    }
+
+    public String getDwmc() {
+        return dwmc;
+    }
+
+    public void setDwmc(String dwmc) {
+        this.dwmc = dwmc;
+    }
+
+    public String getZw() {
+        return zw;
+    }
+
+    public void setZw(String zw) {
+        this.zw = zw;
+    }
+}

+ 30 - 0
src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthorizationRequest.java

@@ -0,0 +1,30 @@
+package com.dragon.tj.portal.auth.model.zeroTrust;
+
+import java.io.Serializable;
+
+public class AuthorizationRequest implements Serializable {
+    private static final long serialVersionUID = -205960148507843883L;
+    private String appTokenId;
+    private String taskId;
+
+    public AuthorizationRequest(String appTokenId, String taskId) {
+        this.appTokenId = appTokenId;
+        this.taskId = taskId;
+    }
+
+    public String getAppTokenId() {
+        return appTokenId;
+    }
+
+    public void setAppTokenId(String appTokenId) {
+        this.appTokenId = appTokenId;
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+}

+ 38 - 0
src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthorizationResponse.java

@@ -0,0 +1,38 @@
+package com.dragon.tj.portal.auth.model.zeroTrust;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+
+public class AuthorizationResponse implements Serializable {
+    public static final String SUCCESS = "0000";
+    private static final long serialVersionUID = -5801293871151627485L;
+    @JsonProperty(value = "status_code")
+    private String statusCode;
+    private String message;
+    private AuthorizationResult data;
+
+    public String getStatusCode() {
+        return statusCode;
+    }
+
+    public void setStatusCode(String statusCode) {
+        this.statusCode = statusCode;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public AuthorizationResult getData() {
+        return data;
+    }
+
+    public void setData(AuthorizationResult data) {
+        this.data = data;
+    }
+}

+ 17 - 0
src/main/java/com/dragon/tj/portal/auth/model/zeroTrust/AuthorizationResult.java

@@ -0,0 +1,17 @@
+package com.dragon.tj.portal.auth.model.zeroTrust;
+
+import java.io.Serializable;
+
+public class AuthorizationResult implements Serializable {
+    private static final long serialVersionUID = -264826196112684730L;
+
+    private String result;
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+}

+ 2 - 2
src/main/java/com/dragon/tj/portal/auth/client/DcucUserClient.java → src/main/java/com/dragon/tj/portal/auth/module/cas/CasAuthenticationClient.java

@@ -1,4 +1,4 @@
-package com.dragon.tj.portal.auth.client;
+package com.dragon.tj.portal.auth.module.cas;
 
 import com.dragon.tj.portal.auth.model.RR;
 import com.dragon.tj.portal.auth.web.entity.SysUser;
@@ -7,7 +7,7 @@ import retrofit2.http.GET;
 import retrofit2.http.Header;
 import retrofit2.http.Path;
 
-public interface DcucUserClient {
+public interface CasAuthenticationClient {
 
     @GET("user-service/v1/users/{idCard}")
     Call<RR<SysUser>> getUserInfo(

+ 2 - 2
src/main/java/com/dragon/tj/portal/auth/client/DcucAuthClient.java → src/main/java/com/dragon/tj/portal/auth/module/cas/CasAuthorizationClient.java

@@ -1,4 +1,4 @@
-package com.dragon.tj.portal.auth.client;
+package com.dragon.tj.portal.auth.module.cas;
 
 import com.dragon.tj.portal.auth.model.AuthReq;
 import com.dragon.tj.portal.auth.model.AuthResult;
@@ -10,7 +10,7 @@ import retrofit2.http.POST;
 
 import java.util.List;
 
-public interface DcucAuthClient {
+public interface CasAuthorizationClient {
 
     @POST("auth-service/v3/auths/functions")
     Call<RR<List<AuthResult>>> getAuthFunctions(

+ 12 - 13
src/main/java/com/dragon/tj/portal/auth/service/MyCasAuthenticationEntryPoint.java → src/main/java/com/dragon/tj/portal/auth/module/cas/MyCasAuthenticationEntryPoint.java

@@ -1,4 +1,4 @@
-package com.dragon.tj.portal.auth.service;
+package com.dragon.tj.portal.auth.module.cas;
 
 import cn.hutool.json.JSONUtil;
 import org.jasig.cas.client.util.CommonUtils;
@@ -101,14 +101,14 @@ public class MyCasAuthenticationEntryPoint implements AuthenticationEntryPoint,
         return this.loginUrl;
     }
 
-    public final ServiceProperties getServiceProperties() {
-        return this.serviceProperties;
-    }
-
     public final void setLoginUrl(String loginUrl) {
         this.loginUrl = loginUrl;
     }
 
+    public final ServiceProperties getServiceProperties() {
+        return this.serviceProperties;
+    }
+
     public final void setServiceProperties(ServiceProperties serviceProperties) {
         this.serviceProperties = serviceProperties;
     }
@@ -116,21 +116,20 @@ public class MyCasAuthenticationEntryPoint implements AuthenticationEntryPoint,
     /**
      * Sets whether to encode the service url with the session id or not.
      *
-     * @param encodeServiceUrlWithSessionId whether to encode the service url with the
-     *                                      session id or not.
+     * @return whether to encode the service url with the session id or not.
      */
-    public final void setEncodeServiceUrlWithSessionId(boolean encodeServiceUrlWithSessionId) {
-        this.encodeServiceUrlWithSessionId = encodeServiceUrlWithSessionId;
+    protected boolean getEncodeServiceUrlWithSessionId() {
+        return this.encodeServiceUrlWithSessionId;
     }
 
     /**
      * Sets whether to encode the service url with the session id or not.
      *
-     * @return whether to encode the service url with the session id or not.
+     * @param encodeServiceUrlWithSessionId whether to encode the service url with the
+     *                                      session id or not.
      */
-    protected boolean getEncodeServiceUrlWithSessionId() {
-        return this.encodeServiceUrlWithSessionId;
+    public final void setEncodeServiceUrlWithSessionId(boolean encodeServiceUrlWithSessionId) {
+        this.encodeServiceUrlWithSessionId = encodeServiceUrlWithSessionId;
     }
 
-
 }

+ 2 - 1
src/main/java/com/dragon/tj/portal/auth/service/MySimpleUrlAuthenticationSuccessHandler.java → src/main/java/com/dragon/tj/portal/auth/module/cas/MySimpleUrlAuthenticationSuccessHandler.java

@@ -1,6 +1,7 @@
-package com.dragon.tj.portal.auth.service;
+package com.dragon.tj.portal.auth.module.cas;
 
 import com.dragon.tj.portal.auth.model.LoginUser;
+import com.dragon.tj.portal.auth.service.TokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.cas.authentication.CasAuthenticationToken;
 import org.springframework.security.core.Authentication;

+ 96 - 0
src/main/java/com/dragon/tj/portal/auth/module/hmac/HmacAuthenticationFilter.java

@@ -0,0 +1,96 @@
+package com.dragon.tj.portal.auth.module.hmac;
+
+import org.apache.commons.codec.digest.HmacAlgorithms;
+import org.apache.commons.codec.digest.HmacUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.UUID;
+
+public class HmacAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
+
+    private JdbcTemplate jdbcTemplate;
+
+    public HmacAuthenticationFilter(String defaultFilterProcessesUrl) {
+        super(defaultFilterProcessesUrl);
+    }
+
+    @Override
+    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
+        String appKey = request.getHeader("appKey");
+        if (StringUtils.isBlank(appKey)) {
+            throw new BadCredentialsException("未设置appKey");
+        }
+        // 时间戳验证
+        String timestamp = request.getHeader("timestamp");
+        if (StringUtils.isBlank(timestamp)) {
+            throw new BadCredentialsException("未设置timestamp");
+        }
+        // 大于5分钟,非法请求
+        long diff = System.currentTimeMillis() - Long.parseLong(timestamp);
+        if (Math.abs(diff) > 1000 * 60 * 5) {
+            throw new BadCredentialsException("请求超时");
+        }
+        // 随机字符串,防止重复提交
+        String nonce = request.getHeader("nonce");
+        if (StringUtils.isEmpty(nonce)) {
+            throw new BadCredentialsException("未设置nonce");
+        }
+        // 验证签名
+        String signature = request.getHeader("signature");
+        if (StringUtils.isEmpty(nonce)) {
+            throw new BadCredentialsException("未设置signature");
+        }
+
+        String appSecret;
+        try {
+            appSecret = jdbcTemplate.queryForObject("select app_secret from app_info where system_number = ?",
+                    String.class, appKey);
+        } catch (Exception e) {
+            throw new BadCredentialsException("查询应用出错,appKey: " + appKey, e);
+        }
+        if (StringUtils.isEmpty(appSecret)) {
+            throw new BadCredentialsException("未查询到该应用,appKey: " + appKey);
+        }
+
+        String signPayload = String.format("%s:%s:%s", appKey, timestamp, nonce);
+        String signResult = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, appSecret).hmacHex(signPayload);
+        if (!signature.equals(signResult)) {
+            throw new BadCredentialsException("Signature验证错误");
+        }
+        // TODO: 2024/7/17 sai nonce重复请求校验
+
+        // authorities参数必填使authenticated为true
+        return new UsernamePasswordAuthenticationToken(appKey, signature, null);
+    }
+
+    @Override
+    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
+        super.successfulAuthentication(request, response, chain, authResult);
+        // continue next filter
+        chain.doFilter(request, response);
+    }
+
+    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
+        this.jdbcTemplate = jdbcTemplate;
+    }
+
+    public static void main(String[] args) {
+        System.out.println(UUID.randomUUID().toString().replace("-", ""));
+        long l = System.currentTimeMillis();
+        System.out.println("timestamp: " + l);
+        String appSecret = "ae14ac8a78104a4392920636c40335ca";
+        String signPayload = String.format("%s:%s:%s", "xxdj05", l, "412710e34fee4c8ba29a210462be8e6b");
+        System.out.println(new HmacUtils(HmacAlgorithms.HMAC_SHA_256, appSecret).hmacHex(signPayload));
+    }
+}

+ 14 - 0
src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthenticationClient.java

@@ -0,0 +1,14 @@
+package com.dragon.tj.portal.auth.module.zerotrust;
+
+import com.dragon.tj.portal.auth.model.zeroTrust.AuthenticationResponse;
+import retrofit2.Call;
+import retrofit2.http.Field;
+import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.POST;
+
+public interface ZeroTrustAuthenticationClient {
+
+    @FormUrlEncoded
+    @POST("tacs/getNewIDPUserAttributes")
+    Call<AuthenticationResponse> getUserInfo(@Field("appId") String appId, @Field("userToken") String userToken);
+}

+ 29 - 0
src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthenticationFilter.java

@@ -0,0 +1,29 @@
+package com.dragon.tj.portal.auth.module.zerotrust;
+
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class ZeroTrustAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
+    private static final String HEADER_USER_TOKEN = "RZZX-USERTOKEN";
+    private static final String HEADER_APP_TOKEN = "RZZX-APPTOKEN";
+
+    public ZeroTrustAuthenticationFilter(String defaultFilterProcessesUrl) {
+        super(defaultFilterProcessesUrl);
+    }
+
+    @Override
+    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
+        String userToken = request.getHeader(HEADER_USER_TOKEN);
+        String appToken = request.getHeader(HEADER_APP_TOKEN);
+        UsernamePasswordAuthenticationToken authRequest =
+                UsernamePasswordAuthenticationToken.unauthenticated(userToken, appToken);
+        // Allow subclasses to set the "details" property
+        authRequest.setDetails(this.authenticationDetailsSource.buildDetails(request));
+        return this.getAuthenticationManager().authenticate(authRequest);
+    }
+}

+ 48 - 0
src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthenticationProvider.java

@@ -0,0 +1,48 @@
+package com.dragon.tj.portal.auth.module.zerotrust;
+
+import com.dragon.tj.portal.auth.model.LoginUser;
+import com.dragon.tj.portal.auth.service.MyUserDetailsService;
+import org.jasig.cas.client.validation.AssertionImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.cas.authentication.CasAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetails;
+
+public class ZeroTrustAuthenticationProvider implements AuthenticationProvider {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ZeroTrustAuthenticationProvider.class);
+    private final MyUserDetailsService userDetailsService;
+
+    public ZeroTrustAuthenticationProvider(MyUserDetailsService userDetailsService) {
+        this.userDetailsService = userDetailsService;
+    }
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        if (authentication.getPrincipal() == null || "".equals(authentication.getPrincipal())) {
+            throw new BadCredentialsException("Failed to get the user token");
+        }
+        if (authentication.getCredentials() == null || "".equals(authentication.getCredentials())) {
+            throw new BadCredentialsException("Failed to get the app token");
+        }
+        String userToken = authentication.getName();
+        String appToken = authentication.getCredentials().toString();
+        LOGGER.info("Current User Token: {}, App Token: {}", userToken, appToken);
+        UserDetails userDetails = userDetailsService.loadUserByZeroTrust(userToken, appToken);
+        if (userDetails instanceof LoginUser) {
+            ((LoginUser) userDetails).setUserToken(userToken);
+            ((LoginUser) userDetails).setAppToken(appToken);
+        }
+        return new CasAuthenticationToken("ZeroTrust", userDetails, authentication.getCredentials(),
+                userDetails.getAuthorities(), userDetails, new AssertionImpl(""));
+    }
+
+    @Override
+    public boolean supports(Class<?> authentication) {
+        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
+    }
+}

+ 13 - 0
src/main/java/com/dragon/tj/portal/auth/module/zerotrust/ZeroTrustAuthorizeClient.java

@@ -0,0 +1,13 @@
+package com.dragon.tj.portal.auth.module.zerotrust;
+
+import com.dragon.tj.portal.auth.model.zeroTrust.AuthorizationRequest;
+import com.dragon.tj.portal.auth.model.zeroTrust.AuthorizationResponse;
+import retrofit2.Call;
+import retrofit2.http.Body;
+import retrofit2.http.POST;
+
+public interface ZeroTrustAuthorizeClient {
+
+    @POST("auth-service/v4/functionAuth")
+    Call<AuthorizationResponse> getAuthFunctions(@Body AuthorizationRequest body);
+}

+ 16 - 0
src/main/java/com/dragon/tj/portal/auth/properties/AppProperties.java

@@ -0,0 +1,16 @@
+package com.dragon.tj.portal.auth.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "app")
+public class AppProperties {
+    private String logoutUrl;
+    private String homeUrl;
+    private String serviceUrl;
+    private String filterUrl;
+    private String targetUrl;
+    private String failureUrl;
+    private String authType;
+}

+ 15 - 0
src/main/java/com/dragon/tj/portal/auth/properties/CasProperties.java

@@ -0,0 +1,15 @@
+package com.dragon.tj.portal.auth.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "auth.cas")
+public class CasProperties {
+    private String appCode;
+    private String baseUrl;
+    private String loginUrl;
+    private String logoutUrl;
+    private String authenticationUrl;
+    private String authorizeUrl;
+}

+ 16 - 0
src/main/java/com/dragon/tj/portal/auth/properties/ZeroTrustProperties.java

@@ -0,0 +1,16 @@
+package com.dragon.tj.portal.auth.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "auth.zerotrust")
+public class ZeroTrustProperties {
+    private String appCode;
+    private String baseUrl;
+    private String loginUrl;
+    private String logoutUrl;
+    private String authenticationUrl;
+    private String authorizeUrl;
+    private String taskId;
+}

+ 4 - 3
src/main/java/com/dragon/tj/portal/auth/service/JwtTokenAuthenticationFilter.java

@@ -2,7 +2,6 @@ package com.dragon.tj.portal.auth.service;
 
 import com.dragon.tj.portal.auth.model.LoginUser;
 import com.dragon.tj.portal.auth.util.SecurityUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
@@ -19,9 +18,11 @@ import java.util.Objects;
 @Component
 public class JwtTokenAuthenticationFilter extends OncePerRequestFilter {
 
-    @Autowired
-    private TokenService tokenService;
+    private final TokenService tokenService;
 
+    public JwtTokenAuthenticationFilter(TokenService tokenService) {
+        this.tokenService = tokenService;
+    }
 
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

+ 9 - 12
src/main/java/com/dragon/tj/portal/auth/service/JwtTokenLogoutSuccessHandler.java

@@ -2,9 +2,6 @@ package com.dragon.tj.portal.auth.service;
 
 import cn.hutool.json.JSONUtil;
 import com.dragon.tj.portal.auth.model.LoginUser;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Configuration;
 import org.springframework.http.MediaType;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
@@ -19,17 +16,17 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
-@Configuration
 public class JwtTokenLogoutSuccessHandler implements LogoutSuccessHandler {
 
-    @Autowired
-    private TokenService tokenService;
+    private final String homeUrl;
+    private final String logoutUrl;
+    private final TokenService tokenService;
 
-    @Value("${cas.logout.url}")
-    private String casLogoutUrl;
-
-    @Value("${app.home.url}")
-    private String appHomeUrl;
+    public JwtTokenLogoutSuccessHandler(String homeUrl, String logoutUrl, TokenService tokenService) {
+        this.homeUrl = homeUrl;
+        this.logoutUrl = logoutUrl;
+        this.tokenService = tokenService;
+    }
 
     /**
      * 退出处理
@@ -43,7 +40,7 @@ public class JwtTokenLogoutSuccessHandler implements LogoutSuccessHandler {
             tokenService.delLoginUser(loginUser.getToken());
         }
         Map<String, String> data = new HashMap<>();
-        data.put("casLogoutUrl", casLogoutUrl + "?service=" + URLEncoder.encode(appHomeUrl, StandardCharsets.UTF_8.name()));
+        data.put("casLogoutUrl", logoutUrl + "?service=" + URLEncoder.encode(homeUrl, StandardCharsets.UTF_8.name()));
         response.setStatus(HttpServletResponse.SC_OK);
         response.setContentType(MediaType.APPLICATION_JSON_VALUE);
         response.getWriter().write(JSONUtil.toJsonStr(data));

+ 0 - 1
src/main/java/com/dragon/tj/portal/auth/service/MyUserDetailsByNameServiceWrapper.java

@@ -17,7 +17,6 @@ public class MyUserDetailsByNameServiceWrapper<T extends Authentication>
 
     private static final String KEY = "gmsfzh";
 
-
     private UserDetailsService userDetailsService;
 
     /**

+ 25 - 15
src/main/java/com/dragon/tj/portal/auth/service/MyUserDetailsService.java

@@ -3,17 +3,14 @@ package com.dragon.tj.portal.auth.service;
 import com.dragon.tj.portal.auth.model.LoginUser;
 import com.dragon.tj.portal.auth.web.entity.SysUser;
 import com.dragon.tj.portal.auth.web.service.SysUserService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
 
 import java.util.HashSet;
+import java.util.List;
 import java.util.Objects;
-import java.util.Set;
 
 /**
  * 用户验证处理
@@ -22,25 +19,38 @@ import java.util.Set;
  */
 @Service
 public class MyUserDetailsService implements UserDetailsService {
-    private static final Logger LOGGER = LoggerFactory.getLogger(MyUserDetailsService.class);
-
-    @Autowired
-    private SysUserService userService;
-    @Autowired
-    private SysPermissionService sysPermissionService;
+    private final SysUserService userService;
+    private final SysPermissionService sysPermissionService;
 
+    public MyUserDetailsService(SysUserService userService, SysPermissionService sysPermissionService) {
+        this.userService = userService;
+        this.sysPermissionService = sysPermissionService;
+    }
 
     @Override
-    public UserDetails loadUserByUsername(String idCard) throws UsernameNotFoundException {
-        SysUser user = userService.getUserById(idCard);
+    public UserDetails loadUserByUsername(String key) throws UsernameNotFoundException {
+        SysUser user = userService.getUserByKey(key);
         if (Objects.isNull(user)) {
-            throw new UsernameNotFoundException(idCard);
+            throw new UsernameNotFoundException(key);
         }
         return createLoginUser(user);
     }
 
-    public UserDetails createLoginUser(SysUser sysUser) {
-        Set<String> permissions = sysPermissionService.getMenuPermission(sysUser);
+    private UserDetails createLoginUser(SysUser sysUser) {
+        List<String> permissions = sysPermissionService.getMenuPermission(sysUser);
+        return new LoginUser(sysUser.getIdcard(), sysUser.getOrgCode(), sysUser, new HashSet<>(permissions));
+    }
+
+    public UserDetails loadUserByZeroTrust(String userToken, String appToken) {
+        SysUser user = userService.getUserFromZeroTrust(userToken);
+        if (Objects.isNull(user)) {
+            throw new UsernameNotFoundException(userToken);
+        }
+        return createLoginUserByZeroTrust(user, userToken, appToken);
+    }
+
+    private UserDetails createLoginUserByZeroTrust(SysUser sysUser, String userToken, String appToken) {
+        List<String> permissions = sysPermissionService.getMenuPermissionFromZeroTrust(userToken, appToken);
         return new LoginUser(sysUser.getIdcard(), sysUser.getOrgCode(), sysUser, new HashSet<>(permissions));
     }
 }

+ 56 - 13
src/main/java/com/dragon/tj/portal/auth/service/SysPermissionService.java

@@ -1,19 +1,23 @@
 package com.dragon.tj.portal.auth.service;
 
-import com.dragon.tj.portal.auth.client.DcucAuthClient;
 import com.dragon.tj.portal.auth.model.AuthReq;
 import com.dragon.tj.portal.auth.model.AuthResult;
 import com.dragon.tj.portal.auth.model.RR;
+import com.dragon.tj.portal.auth.model.zeroTrust.AuthorizationRequest;
+import com.dragon.tj.portal.auth.model.zeroTrust.AuthorizationResponse;
+import com.dragon.tj.portal.auth.module.cas.CasAuthorizationClient;
+import com.dragon.tj.portal.auth.module.zerotrust.ZeroTrustAuthorizeClient;
+import com.dragon.tj.portal.auth.properties.CasProperties;
+import com.dragon.tj.portal.auth.properties.ZeroTrustProperties;
 import com.dragon.tj.portal.auth.web.entity.SysUser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 import retrofit2.Call;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
@@ -28,11 +32,21 @@ import java.util.Set;
 public class SysPermissionService {
     private static final Logger LOGGER = LoggerFactory.getLogger(SysPermissionService.class);
 
-    @Autowired
-    private DcucAuthClient dcucAuthClient;
+    private final CasProperties casProperties;
+    private final ZeroTrustProperties zeroTrustProperties;
+    private final CasAuthorizationClient casAuthorizationClient;
+    private final ZeroTrustAuthorizeClient zeroTrustAuthorizeClient;
 
-    @Value("${app.code}")
-    private String appCode;
+    public SysPermissionService(
+            CasProperties casProperties,
+            ZeroTrustProperties zeroTrustProperties,
+            CasAuthorizationClient casAuthorizationClient,
+            ZeroTrustAuthorizeClient zeroTrustAuthorizeClient) {
+        this.casProperties = casProperties;
+        this.zeroTrustProperties = zeroTrustProperties;
+        this.casAuthorizationClient = casAuthorizationClient;
+        this.zeroTrustAuthorizeClient = zeroTrustAuthorizeClient;
+    }
 
     /**
      * 获取数据权限
@@ -50,17 +64,23 @@ public class SysPermissionService {
      * @param user 用户信息
      * @return 菜单权限信息
      */
-    public Set<String> getMenuPermission(SysUser user) {
-        Set<String> perms = new HashSet<>();
-        String idCard = user.getIdcard();
+    public List<String> getMenuPermission(SysUser user) {
+        // Default Auth: DCUC
+        return getMenuPermissionFromDcuc(user.getIdcard());
+    }
+
+    private List<String> getMenuPermissionFromDcuc(String idCard) {
         try {
             LOGGER.info("登录用户[{}]调用权限管理服务-功能级鉴权接口", idCard);
-            Call<RR<List<AuthResult>>> call = dcucAuthClient.getAuthFunctions(appCode, idCard, new AuthReq(appCode, idCard));
+            Call<RR<List<AuthResult>>> call = casAuthorizationClient.getAuthFunctions(
+                    casProperties.getAppCode(), idCard, new AuthReq(casProperties.getAppCode(), idCard));
             RR<List<AuthResult>> body = call.execute().body();
             if (Objects.nonNull(body)) {
                 if ("200".equals(body.getStatusCode())) {
                     List<AuthResult> results = body.getResult();
-                    perms.addAll(extractPermissions(results));
+                    List<String> permissions = extractPermissions(results);
+                    LOGGER.info("登录用户[{}]调用权限管理服务-功能级鉴权接口 成功: {}", idCard, permissions);
+                    return permissions;
                 } else {
                     LOGGER.error("登录用户[{}]调用权限管理服务-功能级鉴权接口 出错: {}", idCard, body.getMessage());
                 }
@@ -70,8 +90,31 @@ public class SysPermissionService {
         } catch (Exception e) {
             LOGGER.error("登录用户[{}]调用权限管理服务-功能级鉴权接口 出错", idCard, e);
         }
+        return new ArrayList<>();
+    }
 
-        return perms;
+    public List<String> getMenuPermissionFromZeroTrust(String userToken, String appToken) {
+        try {
+            LOGGER.info("登录用户[{}]调用零信任-功能级鉴权接口", userToken);
+            Call<AuthorizationResponse> call = zeroTrustAuthorizeClient.getAuthFunctions(
+                    new AuthorizationRequest(appToken, zeroTrustProperties.getTaskId()));
+            AuthorizationResponse body = call.execute().body();
+            if (Objects.nonNull(body)) {
+                if (AuthorizationResponse.SUCCESS.equals(body.getStatusCode())) {
+                    String results = body.getData().getResult();
+                    List<String> permissions = Arrays.asList(results.split(","));
+                    LOGGER.info("登录用户[{}]调用零信任-功能级鉴权接口 成功: {}", userToken, permissions);
+                    return permissions;
+                } else {
+                    LOGGER.error("登录用户[{}]调用零信任-功能级鉴权接口 出错: {}", userToken, body.getMessage());
+                }
+            } else {
+                LOGGER.error("登录用户[{}]调用零信任-功能级鉴权接口 出错: 返回为空", userToken);
+            }
+        } catch (Exception e) {
+            LOGGER.error("登录用户[{}]调用零信任-功能级鉴权接口 出错", userToken, e);
+        }
+        return new ArrayList<>();
     }
 
     private List<String> extractPermissions(List<AuthResult> results) {

+ 46 - 0
src/main/java/com/dragon/tj/portal/auth/util/SSLSocketManager.java

@@ -0,0 +1,46 @@
+package com.dragon.tj.portal.auth.util;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+public class SSLSocketManager {
+
+    public static SSLSocketFactory getSSLSocketFactory() {
+        try {
+            SSLContext sslContext = SSLContext.getInstance("SSL");
+            sslContext.init(null, new TrustManager[]{getTrustManager()}, new SecureRandom());
+            return sslContext.getSocketFactory();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static X509TrustManager getTrustManager() {
+        return new X509TrustManager() {
+            @Override
+            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
+
+            }
+
+            @Override
+            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+            }
+
+            @Override
+            public X509Certificate[] getAcceptedIssuers() {
+                return new X509Certificate[]{};
+            }
+        };
+    }
+
+    public static HostnameVerifier getHostNameVerifier() {
+        return (s, sslSession) -> true;
+    }
+}

+ 0 - 1
src/main/java/com/dragon/tj/portal/auth/util/SecurityUtils.java

@@ -13,7 +13,6 @@ public class SecurityUtils {
         return SecurityContextHolder.getContext().getAuthentication();
     }
 
-
     /**
      * 获取用户
      **/

+ 0 - 1
src/main/java/com/dragon/tj/portal/auth/web/convert/DeptTreeNodeConvert.java

@@ -8,7 +8,6 @@ import org.mapstruct.MappingConstants;
 @Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
 public interface DeptTreeNodeConvert {
 
-
     DeptTreeNode toVo(SysDept sysDept);
 
 }

+ 2 - 2
src/main/java/com/dragon/tj/portal/auth/web/entity/SysDept.java

@@ -3,11 +3,12 @@ package com.dragon.tj.portal.auth.web.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+
 /**
  * <p>
  * 部门表
@@ -57,5 +58,4 @@ public class SysDept implements Serializable {
 
     private String deleted;
 
-
 }

+ 2 - 2
src/main/java/com/dragon/tj/portal/auth/web/entity/SysMenu.java

@@ -3,11 +3,12 @@ package com.dragon.tj.portal.auth.web.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+
 /**
  * <p>
  * 菜单信息表
@@ -31,5 +32,4 @@ public class SysMenu implements Serializable {
 
     private String parentCode;
 
-
 }

+ 2 - 2
src/main/java/com/dragon/tj/portal/auth/web/entity/SysRole.java

@@ -3,11 +3,12 @@ package com.dragon.tj.portal.auth.web.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+
 /**
  * <p>
  * 角色信息表
@@ -29,5 +30,4 @@ public class SysRole implements Serializable {
 
     private String roleName;
 
-
 }

+ 2 - 1
src/main/java/com/dragon/tj/portal/auth/web/entity/SysUser.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.ToString;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
@@ -20,6 +21,7 @@ import java.util.List;
  */
 @Getter
 @Setter
+@ToString
 @Accessors(chain = true)
 @TableName("sys_user")
 public class SysUser implements Serializable {
@@ -81,5 +83,4 @@ public class SysUser implements Serializable {
 
     private String jobType;
 
-
 }

+ 1 - 1
src/main/java/com/dragon/tj/portal/auth/web/mapper/SysDeptMapper.java

@@ -1,7 +1,7 @@
 package com.dragon.tj.portal.auth.web.mapper;
 
-import com.dragon.tj.portal.auth.web.entity.SysDept;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dragon.tj.portal.auth.web.entity.SysDept;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

+ 1 - 1
src/main/java/com/dragon/tj/portal/auth/web/mapper/SysMenuMapper.java

@@ -1,7 +1,7 @@
 package com.dragon.tj.portal.auth.web.mapper;
 
-import com.dragon.tj.portal.auth.web.entity.SysMenu;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dragon.tj.portal.auth.web.entity.SysMenu;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

+ 1 - 1
src/main/java/com/dragon/tj/portal/auth/web/mapper/SysRoleMapper.java

@@ -1,7 +1,7 @@
 package com.dragon.tj.portal.auth.web.mapper;
 
-import com.dragon.tj.portal.auth.web.entity.SysRole;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dragon.tj.portal.auth.web.entity.SysRole;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

+ 2 - 2
src/main/java/com/dragon/tj/portal/auth/web/mapper/SysUserMapper.java

@@ -1,12 +1,11 @@
 package com.dragon.tj.portal.auth.web.mapper;
 
-import com.dragon.tj.portal.auth.web.entity.SysUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dragon.tj.portal.auth.web.entity.SysUser;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * <p>
@@ -20,5 +19,6 @@ import java.util.Set;
 public interface SysUserMapper extends BaseMapper<SysUser> {
 
     List<SysUser> getUserInfoByOrgIds(@Param("itemCodes") List<String> itemCodes);
+
     List<SysUser> getUserInfoByIds(@Param("clientIds") List<String> clientIds);
 }

+ 1 - 2
src/main/java/com/dragon/tj/portal/auth/web/service/SysDeptService.java

@@ -1,7 +1,7 @@
 package com.dragon.tj.portal.auth.web.service;
 
-import com.dragon.tj.portal.auth.web.entity.SysDept;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.dragon.tj.portal.auth.web.entity.SysDept;
 import com.dragon.tj.portal.common.dto.message.MessageInfoUserInfo;
 
 import java.util.Set;
@@ -16,6 +16,5 @@ import java.util.Set;
  */
 public interface SysDeptService extends IService<SysDept> {
 
-
     MessageInfoUserInfo getAllUsers(Set<String> orgCode, Integer cascade);
 }

+ 1 - 1
src/main/java/com/dragon/tj/portal/auth/web/service/SysMenuService.java

@@ -1,7 +1,7 @@
 package com.dragon.tj.portal.auth.web.service;
 
-import com.dragon.tj.portal.auth.web.entity.SysMenu;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.dragon.tj.portal.auth.web.entity.SysMenu;
 
 /**
  * <p>

+ 1 - 1
src/main/java/com/dragon/tj/portal/auth/web/service/SysRoleService.java

@@ -1,7 +1,7 @@
 package com.dragon.tj.portal.auth.web.service;
 
-import com.dragon.tj.portal.auth.web.entity.SysRole;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.dragon.tj.portal.auth.web.entity.SysRole;
 
 /**
  * <p>

+ 4 - 2
src/main/java/com/dragon/tj/portal/auth/web/service/SysUserService.java

@@ -1,8 +1,8 @@
 package com.dragon.tj.portal.auth.web.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.dragon.tj.portal.auth.web.entity.SysUser;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.dragon.tj.portal.auth.web.entity.SysUser;
 import com.dragon.tj.portal.entity.PageParam;
 
 /**
@@ -15,7 +15,9 @@ import com.dragon.tj.portal.entity.PageParam;
  */
 public interface SysUserService extends IService<SysUser> {
 
-    SysUser getUserById(String idCard);
+    SysUser getUserByKey(String key);
+
+    SysUser getUserFromZeroTrust(String userToken);
 
     Page<SysUser> list(PageParam<SysUser> pageParam);
 }

+ 1 - 1
src/main/java/com/dragon/tj/portal/auth/web/service/impl/SysMenuServiceImpl.java

@@ -1,9 +1,9 @@
 package com.dragon.tj.portal.auth.web.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dragon.tj.portal.auth.web.entity.SysMenu;
 import com.dragon.tj.portal.auth.web.mapper.SysMenuMapper;
 import com.dragon.tj.portal.auth.web.service.SysMenuService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 /**

+ 1 - 1
src/main/java/com/dragon/tj/portal/auth/web/service/impl/SysRoleServiceImpl.java

@@ -1,9 +1,9 @@
 package com.dragon.tj.portal.auth.web.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dragon.tj.portal.auth.web.entity.SysRole;
 import com.dragon.tj.portal.auth.web.mapper.SysRoleMapper;
 import com.dragon.tj.portal.auth.web.service.SysRoleService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 /**

+ 57 - 18
src/main/java/com/dragon/tj/portal/auth/web/service/impl/SysUserServiceImpl.java

@@ -4,8 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.dragon.tj.portal.auth.client.DcucUserClient;
 import com.dragon.tj.portal.auth.model.RR;
+import com.dragon.tj.portal.auth.model.zeroTrust.AuthenticationResponse;
+import com.dragon.tj.portal.auth.model.zeroTrust.AuthenticationResult;
+import com.dragon.tj.portal.auth.module.cas.CasAuthenticationClient;
+import com.dragon.tj.portal.auth.module.zerotrust.ZeroTrustAuthenticationClient;
+import com.dragon.tj.portal.auth.properties.CasProperties;
+import com.dragon.tj.portal.auth.properties.ZeroTrustProperties;
 import com.dragon.tj.portal.auth.web.entity.SysUser;
 import com.dragon.tj.portal.auth.web.mapper.SysUserMapper;
 import com.dragon.tj.portal.auth.web.service.SysUserService;
@@ -13,8 +18,6 @@ import com.dragon.tj.portal.entity.PageParam;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import retrofit2.Call;
@@ -33,20 +36,24 @@ import java.util.Objects;
 public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
     private static final Logger LOGGER = LoggerFactory.getLogger(SysUserServiceImpl.class);
 
-    @Autowired
-    private DcucUserClient dcucUserClient;
+    private final CasProperties casProperties;
+    private final ZeroTrustProperties zeroTrustProperties;
+    private final CasAuthenticationClient casAuthenticationClient;
+    private final ZeroTrustAuthenticationClient zeroTrustAuthenticationClient;
 
-    @Value("${app.code}")
-    private String appCode;
+    public SysUserServiceImpl(
+            CasProperties casProperties, ZeroTrustProperties zeroTrustProperties,
+            CasAuthenticationClient casAuthenticationClient,
+            ZeroTrustAuthenticationClient zeroTrustAuthenticationClient) {
+        this.casProperties = casProperties;
+        this.zeroTrustProperties = zeroTrustProperties;
+        this.casAuthenticationClient = casAuthenticationClient;
+        this.zeroTrustAuthenticationClient = zeroTrustAuthenticationClient;
+    }
 
     @Override
-    public SysUser getUserById(String idCard) {
-        SysUser sysUser = getById(idCard);
-        if (Objects.isNull(sysUser)) {
-            LOGGER.info("登录用户[{}]调用用户管理服务-获取警员详情接口", idCard);
-            sysUser = getUserFromDcuc(idCard);
-        }
-        return sysUser;
+    public SysUser getUserByKey(String key) {
+        return getUserFromDcuc(key);
     }
 
     @Override
@@ -70,19 +77,51 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     public SysUser getUserFromDcuc(String idCard) {
         SysUser sysUser = null;
         try {
-            Call<RR<SysUser>> call = dcucUserClient.getUserInfo(appCode, idCard, idCard);
+            LOGGER.info("登录用户[{}]调用DCUC用户管理服务-获取警员详情接口", idCard);
+            Call<RR<SysUser>> call = casAuthenticationClient.getUserInfo(casProperties.getAppCode(), idCard, idCard);
             RR<SysUser> body = call.execute().body();
             if (Objects.nonNull(body)) {
                 if ("200".equals(body.getStatusCode())) {
                     sysUser = body.getResult();
+                    LOGGER.info("登录用户[{}]调用DCUC用户管理服务-获取警员详情接口 成功: {}", idCard, sysUser);
+                } else {
+                    LOGGER.error("登录用户[{}]调用DCUC用户管理服务-获取警员详情接口 出错: {}", idCard, body.getMessage());
+                }
+            } else {
+                LOGGER.error("登录用户[{}]调用DCUC用户管理服务-获取警员详情接口 出错: 返回为空", idCard);
+            }
+        } catch (Exception e) {
+            LOGGER.error("登录用户[{}]调用DCUC用户管理服务-获取警员详情接口 出错", idCard, e);
+        }
+        return sysUser;
+    }
+
+    @Override
+    public SysUser getUserFromZeroTrust(String userToken) {
+        SysUser sysUser = null;
+        try {
+            LOGGER.info("登录用户[{}]调用零信任-获取认证用户接口", userToken);
+            Call<AuthenticationResponse> call = zeroTrustAuthenticationClient.getUserInfo(
+                    zeroTrustProperties.getAppCode(), userToken);
+            AuthenticationResponse body = call.execute().body();
+            if (Objects.nonNull(body)) {
+                if (AuthenticationResponse.SUCCESS.equals(body.getTag())) {
+                    AuthenticationResult result = body.getResult();
+                    sysUser = new SysUser();
+                    sysUser.setIdcard(result.getSfzh());
+                    sysUser.setName(result.getXm());
+                    sysUser.setPoliceNumber(result.getJh());
+                    sysUser.setOrgCode(result.getDwdm());
+                    sysUser.setOrgName(result.getDwmc());
+                    LOGGER.info("登录用户[{}]调用零信任-获取认证用户接口 成功: {}", userToken, sysUser);
                 } else {
-                    LOGGER.error("登录用户[{}]调用用户管理服务-获取警员详情接口 出错: {}", idCard, body.getMessage());
+                    LOGGER.error("登录用户[{}]调用零信任-获取认证用户接口 出错: {}", userToken, body.getMsg().getInfo());
                 }
             } else {
-                LOGGER.error("登录用户[{}]调用用户管理服务-获取警员详情接口 出错: 返回为空", idCard);
+                LOGGER.error("登录用户[{}]调用零信任-获取认证用户接口 出错: 返回为空", userToken);
             }
         } catch (Exception e) {
-            LOGGER.error("登录用户[{}]调用用户管理服务-获取警员详情接口 出错", idCard, e);
+            LOGGER.error("登录用户[{}]调用零信任-获取认证用户接口 出错", userToken, e);
         }
         return sysUser;
     }

+ 9 - 11
src/main/java/com/dragon/tj/portal/common/constants/BusinessConstants.java

@@ -7,36 +7,34 @@ package com.dragon.tj.portal.common.constants;
  */
 public interface BusinessConstants {
 
-
     /**
      * 1 通知公告
      */
-    public static final Integer DICT_ITEM_ID_1 = 1;
+    Integer DICT_ITEM_ID_1 = 1;
     /**
      * 2 信息交流
      */
-    public static final Integer DICT_ITEM_ID_2 = 2;
+    Integer DICT_ITEM_ID_2 = 2;
     /**
      * 3 标准规范
      */
-    public static final Integer DICT_ITEM_ID_3 = 3;
-
+    Integer DICT_ITEM_ID_3 = 3;
 
     /**
      * 4 任务类
      */
-    public static final Integer DICT_ITEM_ID_4 = 4;
+    Integer DICT_ITEM_ID_4 = 4;
     /**
      * 5 通知类
      */
-    public static final Integer DICT_ITEM_ID_5 = 5;
+    Integer DICT_ITEM_ID_5 = 5;
     /**
      * 6 超期提醒类
      */
-    public static final Integer DICT_ITEM_ID_6 = 6;
+    Integer DICT_ITEM_ID_6 = 6;
 
-    public static final String MENU_APP_PRE = "APP-";
-    public static final String TOPIC_PRE = "sseTopic-";
-    public static final String DEFAULT_ADMIN = "admin";
+    String MENU_APP_PRE = "APP-";
+    String TOPIC_PRE = "sseTopic-";
+    String DEFAULT_ADMIN = "admin";
 
 }

+ 0 - 1
src/main/java/com/dragon/tj/portal/common/constants/CacheConstants.java

@@ -12,5 +12,4 @@ public interface CacheConstants {
      */
     String DICT_DETAILS = "dict_details";
 
-
 }

+ 2 - 1
src/main/java/com/dragon/tj/portal/common/constants/CommonConstants.java

@@ -19,7 +19,6 @@
 
 package com.dragon.tj.portal.common.constants;
 
-
 /**
  * @author huey China.
  * @Description : common常量
@@ -39,5 +38,7 @@ public interface CommonConstants {
 
     String sysCode = "sys_portal";
 
+    String YES = "1";
+    String NO = "0";
 
 }

+ 8 - 9
src/main/java/com/dragon/tj/portal/common/constants/DateTimeFormatterConstant.java

@@ -4,20 +4,19 @@ import java.time.format.DateTimeFormatter;
 
 public class DateTimeFormatterConstant {
 
-	public static final String OF_PATTERN_0 = "yyyy-MM-dd HH:mm:ss";
+    public static final String OF_PATTERN_0 = "yyyy-MM-dd HH:mm:ss";
 
-	public static final String OF_PATTERN_1 = "yyyyMMddHHmmss";
+    public static final String OF_PATTERN_1 = "yyyyMMddHHmmss";
 
-	public static final String OF_PATTERN_2 = "yyyyMMdd";
+    public static final String OF_PATTERN_2 = "yyyyMMdd";
 
-	public static final String OF_PATTERN_4 = "yyMMddHHmmss";
+    public static final String OF_PATTERN_4 = "yyMMddHHmmss";
 
+    public static final DateTimeFormatter FORMATTER0 = DateTimeFormatter.ofPattern(OF_PATTERN_0);
 
-	public static final DateTimeFormatter FORMATTER0 = DateTimeFormatter.ofPattern(OF_PATTERN_0);
+    public static final DateTimeFormatter FORMATTER1 = DateTimeFormatter.ofPattern(OF_PATTERN_1);
 
-	public static final DateTimeFormatter FORMATTER1 = DateTimeFormatter.ofPattern(OF_PATTERN_1);
+    public static final DateTimeFormatter FORMATTER2 = DateTimeFormatter.ofPattern(OF_PATTERN_2);
 
-	public static final DateTimeFormatter FORMATTER2 = DateTimeFormatter.ofPattern(OF_PATTERN_2);
-
-	public static final DateTimeFormatter FORMATTER4 = DateTimeFormatter.ofPattern(OF_PATTERN_4);
+    public static final DateTimeFormatter FORMATTER4 = DateTimeFormatter.ofPattern(OF_PATTERN_4);
 }

+ 0 - 1
src/main/java/com/dragon/tj/portal/common/convert/log/SysLogDTO2SysLogConvert.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.common.convert.log;
 
-
 import com.dragon.tj.portal.component.log.dto.SysLogDTO;
 import com.dragon.tj.portal.entity.SysLog;
 import org.mapstruct.Mapper;

+ 0 - 1
src/main/java/com/dragon/tj/portal/common/convert/mesage/MessageReqConvert.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.common.convert.mesage;
 
-
 import com.dragon.tj.portal.common.dto.message.MessageInfoItem;
 import com.dragon.tj.portal.common.dto.message.MessageInfoReq;
 import com.dragon.tj.portal.entity.MessageInfo;

+ 0 - 2
src/main/java/com/dragon/tj/portal/common/convert/notice/NoticeReqConvert.java

@@ -1,8 +1,6 @@
 package com.dragon.tj.portal.common.convert.notice;
 
-
 import com.dragon.tj.portal.common.dto.message.MessageInfoItem;
-import com.dragon.tj.portal.common.dto.message.MessageInfoReq;
 import com.dragon.tj.portal.common.dto.notice.NoticeInfoReq;
 import com.dragon.tj.portal.entity.NoticeInfo;
 import org.mapstruct.Mapper;

+ 1 - 9
src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoItem.java

@@ -1,12 +1,9 @@
 package com.dragon.tj.portal.common.dto.message;
 
-
 import lombok.Getter;
 import lombok.Setter;
 import org.hibernate.validator.constraints.Range;
 
-import java.util.Set;
-
 /**
  * @author huey China.
  * @Description :
@@ -16,16 +13,14 @@ import java.util.Set;
 @Setter
 public class MessageInfoItem {
 
-
     @Range(min = 1, max = 3, message = "请填入1~3,1 通知公告 2信息交流 3 标准规范 ")
     private Integer messageType;
 
     /**
-     *消息级别
+     * 消息级别
      */
     private Integer messageLevel;
 
-
     /**
      * 阅读状态 默认0未读 1已读
      */
@@ -40,9 +35,6 @@ public class MessageInfoItem {
      *
      *--------------非req参数
      */
-    /**
-     * TODO appId
-     */
     private String appId = "appId";
 
     /**

+ 3 - 11
src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoReq.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.common.dto.message;
 
-
 import lombok.Getter;
 import lombok.Setter;
 import org.hibernate.validator.constraints.Range;
@@ -17,7 +16,6 @@ import java.util.Set;
 @Setter
 public class MessageInfoReq {
 
-
     @Range(min = 1, max = 3, message = "请填入1~3,1 通知公告 2信息交流 3 标准规范 ")
     private Integer messageType;
 
@@ -47,18 +45,15 @@ public class MessageInfoReq {
     private String attachmentPath;
 
     /**
-    *
-    *附近名称
-    */
+     * 附近名称
+     */
     private String attachmentName;
 
-
     /**
      * 版本号
      */
     private Integer version;
 
-
     @NotNull(message = "毫秒时间戳 不能为空")
     private Long t;
 
@@ -72,13 +67,10 @@ public class MessageInfoReq {
      *
      *--------------非req参数
      */
-    /**
-     * TODO appId
-     */
     private String appId = "appId";
 
     /**
-     *消息级别
+     * 消息级别
      */
     private Integer messageLevel = 0;
 

+ 0 - 3
src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoSend.java

@@ -1,12 +1,9 @@
 package com.dragon.tj.portal.common.dto.message;
 
-
 import com.dragon.tj.portal.entity.MessageInfo;
 import lombok.Getter;
 import lombok.Setter;
-import org.hibernate.validator.constraints.Range;
 
-import javax.validation.constraints.NotNull;
 import java.util.Set;
 
 /**

+ 0 - 1
src/main/java/com/dragon/tj/portal/common/dto/message/MessageInfoUserInfo.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.common.dto.message;
 
-
 import com.dragon.tj.portal.auth.web.entity.SysUser;
 import lombok.Getter;
 import lombok.Setter;

+ 0 - 6
src/main/java/com/dragon/tj/portal/common/dto/notice/NoticeInfoItem.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.common.dto.notice;
 
-
 import lombok.Getter;
 import lombok.Setter;
 import org.hibernate.validator.constraints.Range;
@@ -16,7 +15,6 @@ import java.util.Set;
 @Setter
 public class NoticeInfoItem {
 
-
     @Range(min = 1, max = 3, message = "请填入1~3,1 通知公告 2信息交流 3 标准规范 ")
     private Integer messageType;
 
@@ -45,7 +43,6 @@ public class NoticeInfoItem {
      */
     private String attachmentPath;
 
-
     /**
      * 版本号
      */
@@ -55,9 +52,6 @@ public class NoticeInfoItem {
      *
      *--------------非req参数
      */
-    /**
-     * TODO appId
-     */
     private String appId = "appId";
 
     /**

+ 15 - 30
src/main/java/com/dragon/tj/portal/common/dto/notice/NoticeInfoReq.java

@@ -1,13 +1,11 @@
 package com.dragon.tj.portal.common.dto.notice;
 
-
 import lombok.Getter;
 import lombok.Setter;
 import org.hibernate.validator.constraints.Range;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
-import java.util.Set;
 
 /**
  * @author huey China.
@@ -18,26 +16,23 @@ import java.util.Set;
 @Setter
 public class NoticeInfoReq {
 
-
     /**
-    *范围id 为appCode
-    */
-    @NotBlank(message = "应用编码不能为空")
+     * 应用系统编号
+     */
     private String scopeId;
 
     @NotBlank(message = "应用url不能为空")
     private String scopeUrl;
     /**
-    *填充
-    */
+     * 填充
+     */
     private String scopeName;
 
     @Range(min = 4, max = 6, message = "请填入4~6,4 任务类 5 通知类 6 超期提醒类")
     private Integer messageType;
 
-
     /**
-     *消息级别
+     * 消息级别
      */
     private Integer messageLevel = 0;
 
@@ -58,29 +53,19 @@ public class NoticeInfoReq {
      */
     private String attachmentPath;
 
-    @NotNull(message = "毫秒时间戳 不能为空")
-    private Long t;
-
     /**
-    *
-    *推送人的信息
-    */
-    @NotBlank(message = "推送人id 不能为空")
-    private String clientId;
-
-    @NotBlank(message = "推送人组织code 不能为空")
-    private String clientOrgCode;
+     * 推送人的信息
+     */
+    @NotBlank(message = "推送人身份证号 不能为空")
+    private String createIdCard;
 
-    @NotBlank(message = "推送人组织名称 不能为空")
-    private String clientOrgName;
+    @NotBlank(message = "推送人姓名 不能为空")
+    private String createUserName;
 
-    @NotBlank(message = "推送人名称 不能为空")
-    private String clientName;
-    /**
-     * md5 (登录人标识+t)
-     */
-    @NotBlank(message = "调用者身份验证标识 不能为空")
-    private String k;
+    @NotBlank(message = "推送人部门编码 不能为空")
+    private String createOrgCode;
 
+    @NotBlank(message = "推送人部门名称 不能为空")
+    private String createOrgName;
 
 }

+ 0 - 1
src/main/java/com/dragon/tj/portal/common/dto/notice/NoticeInfoSend.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.common.dto.notice;
 
-
 import com.dragon.tj.portal.entity.NoticeInfo;
 import lombok.Getter;
 import lombok.Setter;

+ 6 - 1
src/main/java/com/dragon/tj/portal/common/enums/log/ModuleEnum.java

@@ -41,6 +41,12 @@ public enum ModuleEnum {
     ISSUE_UPDATE("6003", "问题添加"),
     ISSUE_QUERY("6004", "问题查询"),
 
+    COMMENT("7000", "在线留言"),
+    COMMENT_ADD("7001", "留言添加"),
+    COMMENT_QUERY("7004", "留言查询"),
+    COMMENT_DETAIL_ADD("7101", "留言详情添加"),
+    COMMENT_DETAIL_QUERY("7104", "留言详情查询"),
+
     LOGIN("9999", "登录"),
     LOGOUT("9998", "退出登录");
 
@@ -71,5 +77,4 @@ public enum ModuleEnum {
         return list;
     }
 
-
 }

+ 0 - 3
src/main/java/com/dragon/tj/portal/common/enums/message/MessageInfoErrorEnums.java

@@ -21,7 +21,6 @@ import lombok.Getter;
  */
 public interface MessageInfoErrorEnums extends FrameResultError {
 
-
     @Getter
     enum Code implements FrameResultError {
 
@@ -32,10 +31,8 @@ public interface MessageInfoErrorEnums extends FrameResultError {
         NOTICE_LIMIT_EMPTY(201004, "当前消息范围不能为空!"),
         NOTICE_INFO_ERROR(201005, "当前消息编码信息不存在!"),
 
-
         ;
 
-
         Code(int code, String msg) {
             this.code = code;
             this.msg = msg;

+ 4 - 4
src/main/java/com/dragon/tj/portal/common/enums/message/MsgRecordTypeEnum.java

@@ -1,10 +1,10 @@
 package com.dragon.tj.portal.common.enums.message;
 
 /**
-* @author huey China.
-* @Description : 1 信息 2 消息通知
-* @Date Created in
-*/
+ * @author huey China.
+ * @Description : 1 信息 2 消息通知
+ * @Date Created in
+ */
 public enum MsgRecordTypeEnum {
 
     MESSAGE(1, "信息"),

+ 3 - 3
src/main/java/com/dragon/tj/portal/common/util/UploadUtils.java

@@ -10,11 +10,11 @@ public class UploadUtils {
      * @return uuid 随机名称
      */
     public static String getUUIDName(String realName) {
-        //获取后缀名
+        // 获取后缀名
         int index = realName.lastIndexOf(".");
-        if (index == -1) {//如果没有后缀
+        if (index == -1) {// 如果没有后缀
             return UUID.randomUUID().toString().replace("-", "").toUpperCase();
-        } else { //如果有后缀就接上
+        } else { // 如果有后缀就接上
             return UUID.randomUUID().toString().replace("-", "")
                     .toUpperCase() + realName.substring(index);
         }

+ 0 - 2
src/main/java/com/dragon/tj/portal/common/vo/app/AppInfoVo.java

@@ -6,6 +6,4 @@ import lombok.Data;
 @Data
 public class AppInfoVo extends AppInfo {
 
-
-
 }

+ 0 - 2
src/main/java/com/dragon/tj/portal/common/vo/log/LogPageParam.java

@@ -43,6 +43,4 @@ public class LogPageParam extends Page {
     @JsonFormat(pattern = DateTimeFormatterConstant.OF_PATTERN_1)
     private LocalDateTime createTimeEnd;
 
-
-
 }

+ 0 - 2
src/main/java/com/dragon/tj/portal/common/vo/message/MessageInfoParam.java

@@ -16,7 +16,6 @@ import java.time.LocalDateTime;
 @Setter
 public class MessageInfoParam {
 
-
     /**
      * 主键
      */
@@ -70,7 +69,6 @@ public class MessageInfoParam {
      */
     private LocalDateTime updateTime;
 
-
     /**
      * 版本号
      */

+ 0 - 2
src/main/java/com/dragon/tj/portal/common/vo/message/MessageInfoVO.java

@@ -17,7 +17,6 @@ import java.time.LocalDateTime;
 @Setter
 public class MessageInfoVO {
 
-
     /**
      * 主键
      */
@@ -80,7 +79,6 @@ public class MessageInfoVO {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime updateTime;
 
-
     /**
      * 版本号
      */

+ 2 - 5
src/main/java/com/dragon/tj/portal/common/vo/message/MessagePageParam.java

@@ -4,7 +4,6 @@ import com.dragon.tj.portal.common.constants.DateTimeFormatterConstant;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
-import org.hibernate.validator.constraints.Range;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
@@ -24,7 +23,6 @@ public class MessagePageParam {
      */
     private Integer messageType;
 
-
     /**
      * 信息标题
      */
@@ -49,9 +47,8 @@ public class MessagePageParam {
     private LocalDateTime publishTimeEnd;
 
     /**
-    *
-    *已读状态
-    */
+     * 已读状态
+     */
     private Integer readStatus;
 
 }

+ 0 - 2
src/main/java/com/dragon/tj/portal/common/vo/notice/NoticeInfoParam.java

@@ -16,7 +16,6 @@ import java.time.LocalDateTime;
 @Setter
 public class NoticeInfoParam {
 
-
     /**
      * 主键
      */
@@ -70,7 +69,6 @@ public class NoticeInfoParam {
      */
     private LocalDateTime updateTime;
 
-
     /**
      * 版本号
      */

+ 4 - 6
src/main/java/com/dragon/tj/portal/common/vo/notice/NoticeInfoVO.java

@@ -16,7 +16,6 @@ import java.time.LocalDateTime;
 @Setter
 public class NoticeInfoVO {
 
-
     /**
      * 主键
      */
@@ -70,19 +69,18 @@ public class NoticeInfoVO {
      */
     private LocalDateTime updateTime;
     /**
-    *范围而id
-    */
+     * 范围而id
+     */
     private String scopeId;
     /**
-     *范围url
+     * 范围url
      */
     private String scopeUrl;
     /**
-     *范围名称
+     * 范围名称
      */
     private String scopeName;
 
-
     /**
      * 版本号
      */

+ 2 - 4
src/main/java/com/dragon/tj/portal/common/vo/notice/NoticePageParam.java

@@ -23,7 +23,6 @@ public class NoticePageParam {
      */
     private Integer messageType;
 
-
     /**
      * 信息标题
      */
@@ -48,9 +47,8 @@ public class NoticePageParam {
     private LocalDateTime publishTimeEnd;
 
     /**
-    *
-    *已读状态
-    */
+     * 已读状态
+     */
     private Integer readStatus;
 
 }

+ 0 - 1
src/main/java/com/dragon/tj/portal/component/exception/base/FrameAbstractException.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.component.exception.base;
 
-
 /**
  * @author huey China.
  * @Description : 抽象异常

+ 0 - 5
src/main/java/com/dragon/tj/portal/component/exception/base/FrameResultError.java

@@ -9,17 +9,14 @@ import lombok.Getter;
  */
 public interface FrameResultError extends ResultError {
 
-
     @Getter
     enum BaseCode implements FrameResultError {
 
-
         //=========================公共系统异常===========================
         COMMON_SYSTEM_ERROR(100000, "系统错误"),
         COMMON_SYSTEM_NULL_POINT(100001, "空指针异常"),
         COMMON_SYSTEM_DATA_POINT(100002, "数据异常"),
 
-
         //=========================参数校验异常===========================
         PARAM_ERROR(110000, "参数错误"),
         PARAM_HAADER_EMPTY(110001, "header参数为空"),
@@ -27,7 +24,6 @@ public interface FrameResultError extends ResultError {
         PARAM_CLIENTID_ERROR(110003, "clientId参数错误"),
         PARAM_LOGIN_ERROR(110004, "登录失败,请稍后重试"),
 
-
         ;
 
         BaseCode(int code, String msg) {
@@ -45,7 +41,6 @@ public interface FrameResultError extends ResultError {
         private String msg;
     }
 
-
     /**
      * 用户快速根据一个错误描述定义ResultError
      *

+ 2 - 2
src/main/java/com/dragon/tj/portal/component/exception/base/GlobalExceptionHandler.java

@@ -39,10 +39,10 @@ public class GlobalExceptionHandler {
 
     @ExceptionHandler(MethodArgumentNotValidException.class)
     public R handleValidException(MethodArgumentNotValidException e) {
-        //日志记录错误信息
+        // 日志记录错误信息
         String defaultMessage = e.getBindingResult().getFieldError().getDefaultMessage();
         log.error("=================校验器触发错误================" + defaultMessage);
-        //将错误信息返回给前台
+        // 将错误信息返回给前台
         return R.failed(defaultMessage);
     }
 }

+ 1 - 1
src/main/java/com/dragon/tj/portal/component/interceptor/FileInterceptor.java

@@ -32,7 +32,7 @@ public class FileInterceptor implements HandlerInterceptor {
                 .stream().map(s -> s.getId()).collect(Collectors.toList());
         String[] split = requestURI.split("/");
         if (split.length > 2 && softwareIdList.contains(Integer.parseInt(split[2]))) {
-            //写入日志
+            // 写入日志
             fileManageService.fileLog(requestURI, ip);
         }
 

+ 5 - 1
src/main/java/com/dragon/tj/portal/component/log/annotation/SysLog.java

@@ -21,7 +21,11 @@ package com.dragon.tj.portal.component.log.annotation;
 
 import com.dragon.tj.portal.common.enums.log.ModuleEnum;
 
-import java.lang.annotation.*;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
 /**
  * @author huey China.

+ 0 - 1
src/main/java/com/dragon/tj/portal/component/log/aspect/SysLogAspect.java

@@ -108,7 +108,6 @@ public class SysLogAspect {
         return obj;
     }
 
-
     private String params(HttpServletRequest request1, ProceedingJoinPoint point) throws IOException {
         // 获取GET请求的参数列表及对应的值
 

+ 89 - 89
src/main/java/com/dragon/tj/portal/component/log/dto/SysLogDTO.java

@@ -6,97 +6,97 @@ import javax.validation.constraints.NotBlank;
 import java.time.LocalDateTime;
 
 /**
-* @author huey China.
-* @Description : 日志查询传输对象
-* @Date Created in 2023/6/15 15:41
-*/
+ * @author huey China.
+ * @Description : 日志查询传输对象
+ * @Date Created in 2023/6/15 15:41
+ */
 @Data
 public class SysLogDTO {
 
-	/**
-	 * 编号
-	 */
-	private Long id;
-
-	/**
-	 * 日志类型
-	 */
-	@NotBlank(message = "日志类型不能为空")
-	private String type;
-
-	/**
-	 * 日志标题
-	 */
-	@NotBlank(message = "日志标题不能为空")
-	private String title;
-
-	/**
-	 * 创建者
-	 */
-	private String createBy;
-
-	private String createUser;
-
-	/**
-	 * 更新时间
-	 */
-	private LocalDateTime updateTime;
-
-	/**
-	 * 操作IP地址
-	 */
-	private String remoteAddr;
-
-	/**
-	 * 用户代理
-	 */
-	private String userAgent;
-
-	/**
-	 * 请求URI
-	 */
-	private String requestUri;
-
-	/**
-	 * 操作方式
-	 */
-	private String method;
-
-	/**
-	 * 操作提交的数据
-	 */
-	private String params;
-
-	/**
-	 * 执行时间
-	 */
-	private Long time;
-
-	/**
-	 * 异常信息
-	 */
-	private String exception;
-
-	/**
-	 * 创建时间区间 [开始时间,结束时间]
-	 */
-	private LocalDateTime[] createTime;
-
-	/**
-	 * 模块名称
-	 */
-	private String moduleName;
-	private String moduleType;
-
-	/**
-	 * 创建人部门名称和code
-	 */
-	private String createOrgName;
-	private String createOrgCode;
-
-	/**
-	 * 系统编码
-	 */
-	private String sysNumber;
+    /**
+     * 编号
+     */
+    private Long id;
+
+    /**
+     * 日志类型
+     */
+    @NotBlank(message = "日志类型不能为空")
+    private String type;
+
+    /**
+     * 日志标题
+     */
+    @NotBlank(message = "日志标题不能为空")
+    private String title;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    private String createUser;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 操作IP地址
+     */
+    private String remoteAddr;
+
+    /**
+     * 用户代理
+     */
+    private String userAgent;
+
+    /**
+     * 请求URI
+     */
+    private String requestUri;
+
+    /**
+     * 操作方式
+     */
+    private String method;
+
+    /**
+     * 操作提交的数据
+     */
+    private String params;
+
+    /**
+     * 执行时间
+     */
+    private Long time;
+
+    /**
+     * 异常信息
+     */
+    private String exception;
+
+    /**
+     * 创建时间区间 [开始时间,结束时间]
+     */
+    private LocalDateTime[] createTime;
+
+    /**
+     * 模块名称
+     */
+    private String moduleName;
+    private String moduleType;
+
+    /**
+     * 创建人部门名称和code
+     */
+    private String createOrgName;
+    private String createOrgCode;
+
+    /**
+     * 系统编码
+     */
+    private String sysNumber;
 
 }

+ 4 - 4
src/main/java/com/dragon/tj/portal/component/log/event/SysLogEvent.java

@@ -24,10 +24,10 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 /**
-* @author huey China.
-* @Description : 系统日志事件
-* @Date Created in 2023/6/12 16:17
-*/
+ * @author huey China.
+ * @Description : 系统日志事件
+ * @Date Created in 2023/6/12 16:17
+ */
 @Getter
 @AllArgsConstructor
 public class SysLogEvent {

+ 0 - 1
src/main/java/com/dragon/tj/portal/component/log/uitl/LogTypeEnum.java

@@ -1,6 +1,5 @@
 package com.dragon.tj.portal.component.log.uitl;
 
-
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 

+ 3 - 6
src/main/java/com/dragon/tj/portal/component/log/uitl/SysLogUtils.java

@@ -31,7 +31,6 @@ import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Enumeration;
 import java.util.Objects;
 
 /**
@@ -74,7 +73,6 @@ public class SysLogUtils {
         return sysLog;
     }
 
-
     /**
      * 获取用户名称
      *
@@ -84,13 +82,12 @@ public class SysLogUtils {
         return SecurityUtils.getLoginUser().getUsername();
     }
 
-    private  final String sysCode = "sys-number";
+    private final String sysCode = "sys-number";
 
     private static String getSysCode(HttpServletRequest request) {
-        //1. 取出请求里面的所有头信息  ---- 得到一个枚举集合
+        // 1. 取出请求里面的所有头信息  ---- 得到一个枚举集合
         String sysCodeRst = request.getHeader(sysCode);
-        return StringUtils.isNotEmpty(sysCodeRst)? sysCodeRst : StringUtils.EMPTY;
+        return StringUtils.isNotEmpty(sysCodeRst) ? sysCodeRst : StringUtils.EMPTY;
     }
 
-
 }

+ 1 - 6
src/main/java/com/dragon/tj/portal/component/message/KafkaInitialConfiguration.java

@@ -1,16 +1,11 @@
 package com.dragon.tj.portal.component.message;
 
-import cn.hutool.core.collection.CollUtil;
-import com.dragon.tj.portal.service.AppInfoService;
 import org.apache.kafka.clients.admin.NewTopic;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.kafka.config.TopicBuilder;
 import org.springframework.kafka.core.KafkaAdmin;
 
-import java.util.List;
-
 /**
  * @author huey China.
  * @Description : kafka自定义配置
@@ -47,7 +42,7 @@ public class KafkaInitialConfiguration {
 //            newTopics = new NewTopic[]{base};
 //        }
         newTopics = new NewTopic[]{base};
-        //信息相关
+        // 信息相关
         KafkaAdmin.NewTopics infoBase = new KafkaAdmin.NewTopics(newTopics);
         return infoBase;
     }

+ 4 - 7
src/main/java/com/dragon/tj/portal/component/message/MessageProducer.java

@@ -1,4 +1,3 @@
-
 package com.dragon.tj.portal.component.message;
 
 import cn.hutool.core.util.StrUtil;
@@ -7,13 +6,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.kafka.core.KafkaTemplate;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
-
 /**
-* @author huey China.
-* @Description : 生产
-* @Date Created in 2023/6/15 15:42
-*/
+ * @author huey China.
+ * @Description : 生产
+ * @Date Created in 2023/6/15 15:42
+ */
 @Component
 @Slf4j
 public class MessageProducer {

+ 4 - 4
src/main/java/com/dragon/tj/portal/component/message/OpenApiSseEmitter.java

@@ -3,10 +3,10 @@ package com.dragon.tj.portal.component.message;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 /**
-* @author huey China.
-* @Description : 自定义扩展
-* @Date Created in 2023/6/15 15:42
-*/
+ * @author huey China.
+ * @Description : 自定义扩展
+ * @Date Created in 2023/6/15 15:42
+ */
 public class OpenApiSseEmitter extends SseEmitter {
 
     public OpenApiSseEmitter() {

+ 3 - 10
src/main/java/com/dragon/tj/portal/component/message/SseController.java

@@ -1,15 +1,11 @@
 package com.dragon.tj.portal.component.message;
 
-import com.alibaba.fastjson.JSON;
-import com.dragon.tj.portal.auth.model.LoginUser;
-import com.dragon.tj.portal.auth.util.SecurityUtils;
-import com.dragon.tj.portal.common.base.R;
-import com.dragon.tj.portal.common.dto.message.MessageInfoReq;
 import com.dragon.tj.portal.service.MessageInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import javax.annotation.Resource;
@@ -47,7 +43,4 @@ public class SseController {
         return emitter;
     }
 
-
-
-
 }

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini