9 次代碼提交 eada0d8c9e ... b5f86a3636

作者 SHA1 備註 提交日期
  AA b5f86a3636 [Feature] HuaWei ZeroTrust V1.0 8 月之前
  AA f3b2b040a2 [Feature] 飘窗V1.0 10 月之前
  AA ce20e28e77 [Feature] 在线留言V1.0 10 月之前
  AA 878253255a Reset Property files 11 月之前
  AA 82e2792575 [Feature] Message Send Interface: bugfix 11 月之前
  AA 9612a24bb9 [Feature] Message Send Interface: Update Message Sending Interface 11 月之前
  AA 0ce9a7b951 [Feature] Message Send Interface: Add HMAC authentication 11 月之前
  AA b012fb23c7 Add database init file 11 月之前
  AA fcad059d43 Format All Files 11 月之前
共有 100 個文件被更改,包括 1798 次插入531 次删除
  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;
     }
 
-
-
-
 }

Some files were not shown because too many files changed in this diff