diff --git a/.gitignore b/.gitignore index b7838ca0405cb679ac6714da54ee2d8478facd27..7bd9580f540fa107acc629caa0e72f4d180436f4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ os_del.cmd os_del_doc.cmd .svn derby.log +*.log \ No newline at end of file diff --git a/jeecg-boot/.gitignore b/jeecg-boot/.gitignore index b7838ca0405cb679ac6714da54ee2d8478facd27..7bd9580f540fa107acc629caa0e72f4d180436f4 100644 --- a/jeecg-boot/.gitignore +++ b/jeecg-boot/.gitignore @@ -13,3 +13,4 @@ os_del.cmd os_del_doc.cmd .svn derby.log +*.log \ No newline at end of file diff --git a/jeecg-boot/README.md b/jeecg-boot/README.md index 69e9d6ca2540b4eb0ff25365e893622c788ade6c..3d91c07eab3031ae368f9149cc01176cad0cb933 100644 --- a/jeecg-boot/README.md +++ b/jeecg-boot/README.md @@ -2,7 +2,7 @@ JeecgBoot 低代码开发平台 =============== -当前最新版本: 3.8.0(发布日期:2025-04-21) +当前最新版本: 3.8.0(发布日期:2025-05-16) [![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE) diff --git a/jeecg-boot/db/tables_nacos.sql b/jeecg-boot/db/tables_nacos.sql index adcbebe1df205182ddbc792cbfb36e3ac864fc88..939e9b48fde4e8f844919243af59906a339fd414 100644 --- a/jeecg-boot/db/tables_nacos.sql +++ b/jeecg-boot/db/tables_nacos.sql @@ -1,6 +1,6 @@ CREATE database if NOT EXISTS `nacos` default character set utf8mb4 collate utf8mb4_general_ci; use `nacos`; - + /* Navicat Premium Data Transfer @@ -14,7 +14,7 @@ use `nacos`; Target Server Version : 50738 (5.7.38) File Encoding : 65001 - Date: 01/04/2025 22:00:52 + Date: 22/05/2025 10:58:10 */ SET NAMES utf8mb4; @@ -49,9 +49,9 @@ CREATE TABLE `config_info` ( -- ---------------------------- -- Records of config_info -- ---------------------------- -INSERT INTO `config_info` VALUES (1, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,wall,slf4j\n wall:\n selectWhereAlwayTrueCheck: false\n stat:\n merge-sql: true\n slow-sql-millis: 5000\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n redis:\n database: 0\n host: jeecg-boot-redis\n password:\n port: 6379\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 1\n max-concurrency: 1\n retry:\n enabled: true\n flyway:\n enabled: false\n locations: classpath:flyway/sql/mysql\nminidao:\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n uploadType: local\n domainUrl:\n pc: http://localhost:3100\n app: http://localhost:8051\n path:\n upload: /opt/upFiles\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: jeecg-boot-es:9200\n check-enabled: false\n file-view-domain: 127.0.0.1:8012\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n jmreport:\n saasMode:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n xxljob:\n enabled: true\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n ai-chat:\n enabled: false\n apiKey: \"????\"\n apiHost: \"https://api.openai.com\"\n timeout: 60\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\ncas:\n prefixUrl: http://localhost:8888/cas\nknife4j:\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\nthird-app:\n enabled: false\n type:\n WECHAT_ENTERPRISE:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??\n DINGTALK:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??', '057a1634c9b1ebda338515520bd3924a', '2021-03-03 13:01:11', '2025-04-01 13:45:52', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (2, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\n undertow:\n worker-threads: 16\n buffers:\n websocket: 8192\n io: 16384\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\"\n health:\n sensitive: true\n endpoint:\n health:\n show-details: ALWAYS\nspringdoc:\n autoTagClasses: false\n packagesToScan: org.jeecg\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n auto-startup: false\n startup-delay: 1s\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 12000\n clusterCheckinInterval: 15000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n async-executor-activate: false\n job-executor-activate: false\n jpa:\n open-in-view: false\n freemarker:\n suffix: .ftl\n content-type: text/html\n charset: UTF-8\n cache: false\n prefer-file-system-access: false\n template-loader-path:\n - classpath:/templates\n mvc:\n static-path-pattern: /**\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude:\n - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: ASSIGN_ID\n table-underline: true\n configuration:\n call-setters-on-nulls: true', '7f00366a5d35b2bb444f95499c0c40a9', '2021-03-03 13:01:42', '2025-04-01 13:44:52', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (3, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '[{\n \"id\": \"jeecg-system\",\n \"order\": 0,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/sys/**\",\n \"_genkey_1\": \"/jmreport/**\",\n \"_genkey_3\": \"/online/**\",\n \"_genkey_4\": \"/generic/**\",\n \"_genkey_5\": \"/drag/**\",\n \"_genkey_6\": \"/actuator/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo\",\n \"order\": 1,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/mock/**\",\n \"_genkey_1\": \"/test/**\",\n \"_genkey_2\": \"/bigscreen/template1/**\",\n \"_genkey_3\": \"/bigscreen/template2/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-demo\"\n}, {\n \"id\": \"jeecg-system-websocket\",\n \"order\": 2,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/websocket/**\",\n \"_genkey_1\": \"/newsWebsocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo-websocket\",\n \"order\": 3,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/vxeSocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-demo\"\n}]', '708c0948118bdb96bdfaa87200a14432', '2021-03-03 13:02:14', '2024-06-11 16:15:50', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'json', '', ''); +INSERT INTO `config_info` VALUES (1, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,wall,slf4j\n wall:\n selectWhereAlwayTrueCheck: false\n stat:\n merge-sql: true\n slow-sql-millis: 5000\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n redis:\n database: 0\n host: jeecg-boot-redis\n password:\n port: 6379\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 1\n max-concurrency: 1\n retry:\n enabled: true\n flyway:\n enabled: false\n locations: classpath:flyway/sql/mysql\nminidao:\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n uploadType: local\n domainUrl:\n pc: http://localhost:3100\n app: http://localhost:8051\n path:\n upload: /opt/upFiles\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n jmreport:\n saasMode:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n xxljob:\n enabled: true\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n ai-chat:\n enabled: false\n apiKey: \"????\"\n apiHost: \"https://api.openai.com\"\n timeout: 60\n ai-rag:\n embed-store:\n host: 127.0.0.1\n port: 5432\n database: postgres\n user: postgres\n password: postgres\n table: embeddings\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\ncas:\n prefixUrl: http://localhost:8888/cas\nknife4j:\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\nthird-app:\n enabled: false\n type:\n WECHAT_ENTERPRISE:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??\n DINGTALK:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??', 'f1d8102a50c7b1f59458e8f9a0112012', '2021-03-03 13:01:11', '2025-05-19 12:08:56', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (2, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\n undertow:\n worker-threads: 16\n buffers:\n websocket: 8192\n io: 16384\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\"\n health:\n sensitive: true\n endpoint:\n health:\n show-details: ALWAYS\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n auto-startup: false\n startup-delay: 1s\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 12000\n clusterCheckinInterval: 15000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n async-executor-activate: false\n job-executor-activate: false\n jpa:\n open-in-view: false\n freemarker:\n suffix: .ftl\n content-type: text/html\n charset: UTF-8\n cache: false\n prefer-file-system-access: false\n template-loader-path:\n - classpath:/templates\n mvc:\n static-path-pattern: /**\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude:\n - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: ASSIGN_ID\n table-underline: true\n configuration:\n call-setters-on-nulls: true', '20596e678c211d4322ead0000c0ffdbc', '2021-03-03 13:01:42', '2025-05-19 09:51:57', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (3, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '[{\n \"id\": \"jeecg-system\",\n \"order\": 0,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/sys/**\",\n \"_genkey_1\": \"/jmreport/**\",\n \"_genkey_3\": \"/online/**\",\n \"_genkey_4\": \"/generic/**\",\n \"_genkey_5\": \"/drag/**\",\n \"_genkey_6\": \"/actuator/**\",\n \"_genkey_7\": \"/airag/**\",\n \"_genkey_8\": \"/jimubi/**\",\n \"_genkey_9\": \"/openapi/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo\",\n \"order\": 1,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/mock/**\",\n \"_genkey_1\": \"/test/**\",\n \"_genkey_2\": \"/bigscreen/template1/**\",\n \"_genkey_3\": \"/bigscreen/template2/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-demo\"\n}, {\n \"id\": \"jeecg-system-websocket\",\n \"order\": 2,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/websocket/**\",\n \"_genkey_1\": \"/newsWebsocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo-websocket\",\n \"order\": 3,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/vxeSocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-demo\"\n}]', '856da7f7ff7931c6b1932e89d87b83ba', '2021-03-03 13:02:14', '2025-05-21 05:41:09', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'json', '', ''); INSERT INTO `config_info` VALUES (11, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', 'spring:\n shardingsphere:\n datasource:\n names: ds0\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n username: root\n password: root\n type: com.alibaba.druid.pool.DruidDataSource\n props:\n sql-show: true\n rules:\n sharding:\n binding-tables: sys_log\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n tables:\n sys_log:\n actual-data-nodes: ds0.sys_log$->{0..1}\n table-strategy:\n standard:\n sharding-algorithm-name: table-classbased\n sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2022-04-13 03:12:28', '2022-08-07 13:13:57', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', NULL); INSERT INTO `config_info` VALUES (20, 'jeecg-gateway-dev.yaml', 'DEFAULT_GROUP', 'jeecg:\n route:\n config:\n #type:database nacos yml\n data-type: database\n data-id: jeecg-gateway-router\nspring:\n redis:\n database: 0\n host: jeecg-boot-redis\n port: 6379\n password:\nknife4j:\n production: false', '98e211c54b43a73f7189d92f1c77f815', '2022-08-04 16:36:11', '2024-06-11 16:13:15', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (22, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', 'spring:\n shardingsphere:\n datasource:\n names: ds0,ds1\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n type: com.alibaba.druid.pool.DruidDataSource\n username: root\n password: root\n ds1:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n type: com.alibaba.druid.pool.DruidDataSource\n username: root\n password: root\n props:\n sql-show: true\n rules:\n replica-query:\n load-balancers:\n round-robin:\n type: ROUND_ROBIN\n props:\n default: 0\n data-sources:\n prds:\n primary-data-source-name: ds0\n replica-data-source-names: ds1\n load-balancer-name: round_robin\n sharding:\n binding-tables:\n - sys_log\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n database-inline:\n type: INLINE\n props:\n algorithm-expression: ds$->{operate_type % 2}\n tables:\n sys_log:\n actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n database-strategy:\n standard:\n sharding-column: operate_type\n sharding-algorithm-name: database-inline\n table-strategy:\n standard:\n sharding-algorithm-name: table-classbased\n sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2022-08-07 06:09:01', '2022-08-07 13:03:52', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', NULL); @@ -67,8 +67,8 @@ INSERT INTO `config_info` VALUES (39, 'jeecg-gateway-router.json', 'DEFAULT_GROU INSERT INTO `config_info` VALUES (40, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', 'spring:\n shardingsphere:\n datasource:\n names: ds0\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n username: root\n password: root\n type: com.alibaba.druid.pool.DruidDataSource\n props:\n sql-show: true\n rules:\n sharding:\n binding-tables: sys_log\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n tables:\n sys_log:\n actual-data-nodes: ds0.sys_log$->{0..1}\n table-strategy:\n standard:\n sharding-algorithm-name: table-classbased\n sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2024-02-29 09:10:12', '2024-02-29 09:10:12', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', NULL, NULL, 'yaml', NULL, ''); INSERT INTO `config_info` VALUES (41, 'jeecg-gateway-dev.yaml', 'DEFAULT_GROUP', 'jeecg:\n route:\n config:\n #type:database nacos yml\n data-type: database\n data-id: jeecg-gateway-router\nspring:\n data:\n redis:\n database: 0\n host: jeecg-boot-redis\n port: 6379\n password:\nknife4j:\n production: false', '19d7cd93eeb85a582c8a6942d499c7f7', '2024-02-29 09:10:12', '2024-06-11 16:26:12', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (42, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', 'spring:\n shardingsphere:\n datasource:\n names: ds0,ds1\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n type: com.alibaba.druid.pool.DruidDataSource\n username: root\n password: root\n ds1:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n type: com.alibaba.druid.pool.DruidDataSource\n username: root\n password: root\n props:\n sql-show: true\n rules:\n replica-query:\n load-balancers:\n round-robin:\n type: ROUND_ROBIN\n props:\n default: 0\n data-sources:\n prds:\n primary-data-source-name: ds0\n replica-data-source-names: ds1\n load-balancer-name: round_robin\n sharding:\n binding-tables:\n - sys_log\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n database-inline:\n type: INLINE\n props:\n algorithm-expression: ds$->{operate_type % 2}\n tables:\n sys_log:\n actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n database-strategy:\n standard:\n sharding-column: operate_type\n sharding-algorithm-name: database-inline\n table-strategy:\n standard:\n sharding-algorithm-name: table-classbased\n sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2024-02-29 09:10:12', '2024-02-29 09:10:12', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` VALUES (43, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,wall,slf4j\n wall:\n selectWhereAlwayTrueCheck: false\n stat:\n merge-sql: true\n slow-sql-millis: 5000\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n data:\n redis:\n database: 0\n host: jeecg-boot-redis\n password:\n port: 6379\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 1\n max-concurrency: 1\n retry:\n enabled: true\n flyway:\n enabled: false\n encoding: UTF-8\n locations: classpath:flyway/sql/mysql\n sql-migration-prefix: V\n sql-migration-separator: __\n placeholder-prefix: \'#(\'\n placeholder-suffix: )\n sql-migration-suffixes: .sql\n validate-on-migrate: true\n baseline-on-migrate: true\n clean-disabled: true\nminidao:\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\n uploadType: local\n domainUrl:\n pc: http://localhost:3100\n app: http://localhost:8051\n path:\n upload: /opt/upFiles\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: jeecg-boot-es:9200\n check-enabled: false\n file-view-domain: 127.0.0.1:8012\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n jmreport:\n saasMode:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n xxljob:\n enabled: false\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n ai-chat:\n enabled: false\n apiKey: \"????\"\n apiHost: \"https://api.openai.com\"\n timeout: 60\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\ncas:\n prefixUrl: http://localhost:8888/cas\nknife4j:\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\nthird-app:\n enabled: false\n type:\n WECHAT_ENTERPRISE:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??\n DINGTALK:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??', '91c29720dfb424916a769201a25200cf', '2024-06-22 15:11:57', '2024-06-22 15:11:57', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` VALUES (44, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\n undertow:\n # max-http-post-size: 10MB\n worker-threads: 16\n buffers:\n websocket: 8192\n io: 16384\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\"\n health:\n sensitive: true\n endpoint:\n health:\n show-details: ALWAYS\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n auto-startup: false\n startup-delay: 1s\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 12000\n clusterCheckinInterval: 15000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n async-executor-activate: false\n job-executor-activate: false\n jpa:\n open-in-view: false\n freemarker:\n suffix: .ftl\n content-type: text/html\n charset: UTF-8\n cache: false\n prefer-file-system-access: false\n template-loader-path:\n - classpath:/templates\n mvc:\n static-path-pattern: /**\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude:\n - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: ASSIGN_ID\n table-underline: true\n configuration:\n call-setters-on-nulls: true', '8860aa44bce409e17347661601bcda26', '2024-06-22 15:11:57', '2024-10-19 11:06:32', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (43, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,wall,slf4j\n wall:\n selectWhereAlwayTrueCheck: false\n stat:\n merge-sql: true\n slow-sql-millis: 5000\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n data:\n redis:\n database: 0\n host: jeecg-boot-redis\n password:\n port: 6379\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 1\n max-concurrency: 1\n retry:\n enabled: true\n flyway:\n enabled: false\n locations: classpath:flyway/sql/mysql\n clean-disabled: true\nminidao:\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\n uploadType: local\n domainUrl:\n pc: http://localhost:3100\n app: http://localhost:8051\n path:\n upload: /opt/upFiles\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ?? \n file-view-domain: 127.0.0.1:8012\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n jmreport:\n saasMode:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n xxljob:\n enabled: false\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n ai-chat:\n enabled: false\n apiKey: \"????\"\n apiHost: \"https://api.openai.com\"\n timeout: 60\n ai-rag:\n embed-store:\n host: 127.0.0.1\n port: 5432\n database: postgres\n user: postgres\n password: postgres\n table: embeddings\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\ncas:\n prefixUrl: http://localhost:8888/cas\nknife4j:\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\nthird-app:\n enabled: false\n type:\n WECHAT_ENTERPRISE:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??\n DINGTALK:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??', 'dff588d1a47f42650e691b6621a401a8', '2024-06-22 15:11:57', '2025-05-19 09:48:01', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (44, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\n undertow:\n # max-http-post-size: 10MB\n worker-threads: 16\n buffers:\n websocket: 8192\n io: 16384\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: metrics,httpexchanges,jeecghttptrace\n # include: \"*\"\n health:\n sensitive: true\n endpoint:\n health:\n show-details: ALWAYS\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n auto-startup: false\n startup-delay: 1s\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 12000\n clusterCheckinInterval: 15000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n async-executor-activate: false\n job-executor-activate: false\n jpa:\n open-in-view: false\n freemarker:\n suffix: .ftl\n content-type: text/html\n charset: UTF-8\n cache: false\n prefer-file-system-access: false\n template-loader-path:\n - classpath:/templates\n mvc:\n static-path-pattern: /**\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude:\n - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: ASSIGN_ID\n table-underline: true\n configuration:\n call-setters-on-nulls: true', '3a9678386fcd1b29874f358115b209d3', '2024-06-22 15:11:57', '2025-05-15 12:13:38', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (45, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '[{\n \"id\": \"jeecg-system\",\n \"order\": 0,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/sys/**\",\n \"_genkey_1\": \"/jmreport/**\",\n \"_genkey_3\": \"/online/**\",\n \"_genkey_4\": \"/generic/**\",\n \"_genkey_5\": \"/oauth2/**\",\n \"_genkey_6\": \"/drag/**\",\n \"_genkey_7\": \"/actuator/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo\",\n \"order\": 1,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/mock/**\",\n \"_genkey_1\": \"/test/**\",\n \"_genkey_2\": \"/bigscreen/template1/**\",\n \"_genkey_3\": \"/bigscreen/template2/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-demo\"\n}, {\n \"id\": \"jeecg-system-websocket\",\n \"order\": 2,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/websocket/**\",\n \"_genkey_1\": \"/newsWebsocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo-websocket\",\n \"order\": 3,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/vxeSocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-demo\"\n}]', '9794beb09d30bc6b835f2ee870781587', '2024-06-22 15:11:57', '2024-06-22 15:11:57', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', NULL, NULL, 'json', NULL, ''); INSERT INTO `config_info` VALUES (46, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', 'spring:\n shardingsphere:\n datasource:\n names: ds0\n ds0:\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n username: root\n password: root\n type: com.alibaba.druid.pool.DruidDataSource\n props:\n sql-show: true\n rules:\n sharding:\n binding-tables: sys_log\n key-generators:\n snowflake:\n type: SNOWFLAKE\n props:\n worker-id: 123\n sharding-algorithms:\n table-classbased:\n props:\n strategy: standard\n algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n type: CLASS_BASED\n tables:\n sys_log:\n actual-data-nodes: ds0.sys_log$->{0..1}\n table-strategy:\n standard:\n sharding-algorithm-name: table-classbased\n sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2024-06-22 15:11:57', '2024-06-22 15:11:57', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', NULL, NULL, 'yaml', NULL, ''); INSERT INTO `config_info` VALUES (47, 'jeecg-gateway-dev.yaml', 'DEFAULT_GROUP', 'jeecg:\n route:\n config:\n #type:database nacos yml\n data-type: database\n data-id: jeecg-gateway-router\nspring:\n data:\n redis:\n database: 0\n host: jeecg-boot-redis\n port: 6379\n password:\nknife4j:\n production: false', '19d7cd93eeb85a582c8a6942d499c7f7', '2024-06-22 15:11:57', '2024-06-22 15:11:57', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', NULL, NULL, 'yaml', NULL, ''); @@ -214,13 +214,16 @@ CREATE TABLE `his_config_info` ( INDEX `idx_gmt_create`(`gmt_create`) USING BTREE, INDEX `idx_gmt_modified`(`gmt_modified`) USING BTREE, INDEX `idx_did`(`data_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '多租户改造' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '多租户改造' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of his_config_info -- ---------------------------- -INSERT INTO `his_config_info` VALUES (2, 1, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\n tomcat:\n max-swallow-size: -1\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\"\n health:\n sensitive: true\n endpoint:\n health:\n show-details: ALWAYS\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n auto-startup: false\n startup-delay: 1s\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 12000\n clusterCheckinInterval: 15000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n async-executor-activate: false\n job-executor-activate: false\n jpa:\n open-in-view: false\n freemarker:\n suffix: .ftl\n content-type: text/html\n charset: UTF-8\n cache: false\n prefer-file-system-access: false\n template-loader-path:\n - classpath:/templates\n mvc:\n static-path-pattern: /**\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude:\n - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: ASSIGN_ID\n table-underline: true\n configuration:\n call-setters-on-nulls: true', '94dbdad61f7e2e3ace5a4fc07bb8c2a2', '2010-05-05 00:00:00', '2025-04-01 13:44:52', NULL, '0:0:0:0:0:0:0:1', 'U', '', ''); -INSERT INTO `his_config_info` VALUES (1, 2, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,wall,slf4j\n wall:\n selectWhereAlwayTrueCheck: false\n stat:\n merge-sql: true\n slow-sql-millis: 5000\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n redis:\n database: 0\n host: jeecg-boot-redis\n password:\n port: 6379\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 1\n max-concurrency: 1\n retry:\n enabled: true\n flyway:\n enabled: false\n encoding: UTF-8\n locations: classpath:flyway/sql/mysql\n sql-migration-prefix: V\n sql-migration-separator: __\n placeholder-prefix: \'#(\'\n placeholder-suffix: )\n sql-migration-suffixes: .sql\n validate-on-migrate: true\n baseline-on-migrate: true\n clean-disabled: true\nminidao:\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n uploadType: local\n domainUrl:\n pc: http://localhost:3100\n app: http://localhost:8051\n path:\n upload: /opt/upFiles\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: jeecg-boot-es:9200\n check-enabled: false\n file-view-domain: 127.0.0.1:8012\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n jmreport:\n saasMode:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n xxljob:\n enabled: true\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n ai-chat:\n enabled: false\n apiKey: \"????\"\n apiHost: \"https://api.openai.com\"\n timeout: 60\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\ncas:\n prefixUrl: http://localhost:8888/cas\nknife4j:\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\nthird-app:\n enabled: false\n type:\n WECHAT_ENTERPRISE:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??\n DINGTALK:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??', '822f70f7a278a503a02568186582ceaa', '2010-05-05 00:00:00', '2025-04-01 13:45:52', NULL, '0:0:0:0:0:0:0:1', 'U', '', ''); +INSERT INTO `his_config_info` VALUES (44, 3, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\n undertow:\n # max-http-post-size: 10MB\n worker-threads: 16\n buffers:\n websocket: 8192\n io: 16384\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\"\n health:\n sensitive: true\n endpoint:\n health:\n show-details: ALWAYS\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n auto-startup: false\n startup-delay: 1s\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 12000\n clusterCheckinInterval: 15000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n async-executor-activate: false\n job-executor-activate: false\n jpa:\n open-in-view: false\n freemarker:\n suffix: .ftl\n content-type: text/html\n charset: UTF-8\n cache: false\n prefer-file-system-access: false\n template-loader-path:\n - classpath:/templates\n mvc:\n static-path-pattern: /**\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude:\n - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: ASSIGN_ID\n table-underline: true\n configuration:\n call-setters-on-nulls: true', '8860aa44bce409e17347661601bcda26', '2010-05-05 00:00:00', '2025-05-15 12:13:38', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', ''); +INSERT INTO `his_config_info` VALUES (43, 4, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,wall,slf4j\n wall:\n selectWhereAlwayTrueCheck: false\n stat:\n merge-sql: true\n slow-sql-millis: 5000\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n data:\n redis:\n database: 0\n host: jeecg-boot-redis\n password:\n port: 6379\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 1\n max-concurrency: 1\n retry:\n enabled: true\n flyway:\n enabled: false\n encoding: UTF-8\n locations: classpath:flyway/sql/mysql\n sql-migration-prefix: V\n sql-migration-separator: __\n placeholder-prefix: \'#(\'\n placeholder-suffix: )\n sql-migration-suffixes: .sql\n validate-on-migrate: true\n baseline-on-migrate: true\n clean-disabled: true\nminidao:\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\n uploadType: local\n domainUrl:\n pc: http://localhost:3100\n app: http://localhost:8051\n path:\n upload: /opt/upFiles\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: jeecg-boot-es:9200\n check-enabled: false\n file-view-domain: 127.0.0.1:8012\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n jmreport:\n saasMode:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n xxljob:\n enabled: false\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n ai-chat:\n enabled: false\n apiKey: \"????\"\n apiHost: \"https://api.openai.com\"\n timeout: 60\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\ncas:\n prefixUrl: http://localhost:8888/cas\nknife4j:\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\nthird-app:\n enabled: false\n type:\n WECHAT_ENTERPRISE:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??\n DINGTALK:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??', '91c29720dfb424916a769201a25200cf', '2010-05-05 00:00:00', '2025-05-19 09:48:01', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', ''); +INSERT INTO `his_config_info` VALUES (2, 5, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\n undertow:\n worker-threads: 16\n buffers:\n websocket: 8192\n io: 16384\n error:\n include-exception: true\n include-stacktrace: ALWAYS\n include-message: ALWAYS\n compression:\n enabled: true\n min-response-size: 1024\n mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \"*\"\n health:\n sensitive: true\n endpoint:\n health:\n show-details: ALWAYS\nspringdoc:\n autoTagClasses: false\n packagesToScan: org.jeecg\nspring:\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 10MB\n mail:\n host: smtp.163.com\n username: jeecgos@163.com\n password: ??\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n quartz:\n job-store-type: jdbc\n initialize-schema: embedded\n auto-startup: false\n startup-delay: 1s\n overwrite-existing-jobs: true\n properties:\n org:\n quartz:\n scheduler:\n instanceName: MyScheduler\n instanceId: AUTO\n jobStore:\n class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n tablePrefix: QRTZ_\n isClustered: true\n misfireThreshold: 12000\n clusterCheckinInterval: 15000\n threadPool:\n class: org.quartz.simpl.SimpleThreadPool\n threadCount: 10\n threadPriority: 5\n threadsInheritContextClassLoaderOfInitializingThread: true\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: GMT+8\n aop:\n proxy-target-class: true\n activiti:\n check-process-definitions: false\n async-executor-activate: false\n job-executor-activate: false\n jpa:\n open-in-view: false\n freemarker:\n suffix: .ftl\n content-type: text/html\n charset: UTF-8\n cache: false\n prefer-file-system-access: false\n template-loader-path:\n - classpath:/templates\n mvc:\n static-path-pattern: /**\n pathmatch:\n matching-strategy: ant_path_matcher\n resource:\n static-locations: classpath:/static/,classpath:/public/\n autoconfigure:\n exclude:\n - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: ASSIGN_ID\n table-underline: true\n configuration:\n call-setters-on-nulls: true', '7f00366a5d35b2bb444f95499c0c40a9', '2010-05-05 00:00:00', '2025-05-19 09:51:57', NULL, '0:0:0:0:0:0:0:1', 'U', '', ''); +INSERT INTO `his_config_info` VALUES (1, 6, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n allow:\n web-stat-filter:\n enabled: true\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,wall,slf4j\n wall:\n selectWhereAlwayTrueCheck: false\n stat:\n merge-sql: true\n slow-sql-millis: 5000\n datasource:\n master:\n url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n username: root\n password: root\n driver-class-name: com.mysql.cj.jdbc.Driver\n redis:\n database: 0\n host: jeecg-boot-redis\n password:\n port: 6379\n rabbitmq:\n host: jeecg-boot-rabbitmq\n username: guest\n password: guest\n port: 5672\n publisher-confirms: true\n publisher-returns: true\n virtual-host: /\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 1\n max-concurrency: 1\n retry:\n enabled: true\n flyway:\n enabled: false\n locations: classpath:flyway/sql/mysql\nminidao:\n base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n uploadType: local\n domainUrl:\n pc: http://localhost:3100\n app: http://localhost:8051\n path:\n upload: /opt/upFiles\n webapp: /opt/webapp\n shiro:\n excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n oss:\n endpoint: oss-cn-beijing.aliyuncs.com\n accessKey: ??\n secretKey: ??\n bucketName: jeecgdev\n staticDomain: ??\n elasticsearch:\n cluster-name: jeecg-ES\n cluster-nodes: jeecg-boot-es:9200\n check-enabled: false\n file-view-domain: 127.0.0.1:8012\n minio:\n minio_url: http://minio.jeecg.com\n minio_name: ??\n minio_pass: ??\n bucketName: otatest\n jmreport:\n saasMode:\n firewall:\n dataSourceSafe: false\n lowCodeMode: dev\n wps:\n domain: https://wwo.wps.cn/office/\n appid: ??\n appsecret: ??\n xxljob:\n enabled: true\n adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n appname: ${spring.application.name}\n accessToken: \'\'\n logPath: logs/jeecg/job/jobhandler/\n logRetentionDays: 30\n redisson:\n address: jeecg-boot-redis:6379\n password:\n type: STANDALONE\n enabled: true\n ai-chat:\n enabled: false\n apiKey: \"????\"\n apiHost: \"https://api.openai.com\"\n timeout: 60\nlogging:\n level:\n org.jeecg.modules.system.mapper : info\ncas:\n prefixUrl: http://localhost:8888/cas\nknife4j:\n production: false\n basic:\n enable: false\n username: jeecg\n password: jeecg1314\njustauth:\n enabled: true\n type:\n GITHUB:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n WECHAT_ENTERPRISE:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n agent-id: ??\n DINGTALK:\n client-id: ??\n client-secret: ??\n redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n cache:\n type: default\n prefix: \'demo::\'\n timeout: 1h\nthird-app:\n enabled: false\n type:\n WECHAT_ENTERPRISE:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??\n DINGTALK:\n enabled: false\n client-id: ??\n client-secret: ??\n agent-id: ??', '057a1634c9b1ebda338515520bd3924a', '2010-05-05 00:00:00', '2025-05-19 12:08:56', NULL, '0:0:0:0:0:0:0:1', 'U', '', ''); +INSERT INTO `his_config_info` VALUES (3, 7, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '', '[{\n \"id\": \"jeecg-system\",\n \"order\": 0,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/sys/**\",\n \"_genkey_1\": \"/jmreport/**\",\n \"_genkey_3\": \"/online/**\",\n \"_genkey_4\": \"/generic/**\",\n \"_genkey_5\": \"/drag/**\",\n \"_genkey_6\": \"/actuator/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo\",\n \"order\": 1,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/mock/**\",\n \"_genkey_1\": \"/test/**\",\n \"_genkey_2\": \"/bigscreen/template1/**\",\n \"_genkey_3\": \"/bigscreen/template2/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb://jeecg-demo\"\n}, {\n \"id\": \"jeecg-system-websocket\",\n \"order\": 2,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/websocket/**\",\n \"_genkey_1\": \"/newsWebsocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-system\"\n}, {\n \"id\": \"jeecg-demo-websocket\",\n \"order\": 3,\n \"predicates\": [{\n \"name\": \"Path\",\n \"args\": {\n \"_genkey_0\": \"/vxeSocket/**\"\n }\n }],\n \"filters\": [],\n \"uri\": \"lb:ws://jeecg-demo\"\n}]', '708c0948118bdb96bdfaa87200a14432', '2010-05-05 00:00:00', '2025-05-21 05:41:09', NULL, '0:0:0:0:0:0:0:1', 'U', '', ''); -- ---------------------------- -- Table structure for permissions diff --git "a/jeecg-boot/db/\345\242\236\351\207\217SQL/sas\345\215\207\347\272\247\350\204\232\346\234\254.sql" "b/jeecg-boot/db/\345\242\236\351\207\217SQL/sas\345\215\207\347\272\247\350\204\232\346\234\254.sql" new file mode 100644 index 0000000000000000000000000000000000000000..818a1b5ea5bef40efcaa64303c774bedf931df48 --- /dev/null +++ "b/jeecg-boot/db/\345\242\236\351\207\217SQL/sas\345\215\207\347\272\247\350\204\232\346\234\254.sql" @@ -0,0 +1,45 @@ +CREATE TABLE `oauth2_registered_client` ( + `id` varchar(100) NOT NULL, + `client_id` varchar(100) NOT NULL, + `client_id_issued_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `client_secret` varchar(200) DEFAULT NULL, + `client_secret_expires_at` timestamp NULL DEFAULT NULL, + `client_name` varchar(200) NOT NULL, + `client_authentication_methods` varchar(1000) NOT NULL, + `authorization_grant_types` varchar(1000) NOT NULL, + `redirect_uris` varchar(1000) DEFAULT NULL, + `post_logout_redirect_uris` varchar(1000) DEFAULT NULL, + `scopes` varchar(1000) NOT NULL, + `client_settings` varchar(2000) NOT NULL, + `token_settings` varchar(2000) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +INSERT INTO `oauth2_registered_client` +(`id`, +`client_id`, +`client_id_issued_at`, +`client_secret`, +`client_secret_expires_at`, +`client_name`, +`client_authentication_methods`, +`authorization_grant_types`, +`redirect_uris`, +`post_logout_redirect_uris`, +`scopes`, +`client_settings`, +`token_settings`) +VALUES +('3eacac0e-0de9-4727-9a64-6bdd4be2ee1f', +'jeecg-client', +now(), +'secret', +null, +'3eacac0e-0de9-4727-9a64-6bdd4be2ee1f', +'client_secret_basic', +'refresh_token,authorization_code,password,app,phone,social', +'http://127.0.0.1:8080/jeecg-', +'http://127.0.0.1:8080/', +'*', +'{"@class":"java.util.Collections$UnmodifiableMap","settings.client.require-proof-key":false,"settings.client.require-authorization-consent":true}', +'{"@class":"java.util.Collections$UnmodifiableMap","settings.token.reuse-refresh-tokens":true,"settings.token.id-token-signature-algorithm":["org.springframework.security.oauth2.jose.jws.SignatureAlgorithm","RS256"],"settings.token.access-token-time-to-live":["java.time.Duration",300000.000000000],"settings.token.access-token-format":{"@class":"org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat","value":"self-contained"},"settings.token.refresh-token-time-to-live":["java.time.Duration",3600.000000000],"settings.token.authorization-code-time-to-live":["java.time.Duration",300000.000000000],"settings.token.device-code-time-to-live":["java.time.Duration",300000.000000000]}'); diff --git "a/jeecg-boot/db/\347\211\210\346\234\254\345\215\207\347\272\247\350\257\264\346\230\216.md" "b/jeecg-boot/db/\347\211\210\346\234\254\345\215\207\347\272\247\350\257\264\346\230\216.md" index 2bcc85e1421738372e0b278d59250280088312ec..20ae0be81a82533d283163f545572b69994559ad 100644 --- "a/jeecg-boot/db/\347\211\210\346\234\254\345\215\207\347\272\247\350\257\264\346\230\216.md" +++ "b/jeecg-boot/db/\347\211\210\346\234\254\345\215\207\347\272\247\350\257\264\346\230\216.md" @@ -3,6 +3,7 @@ > JeecgBoot属于平台级产品,每次升级改动较大,目前做不到平滑升级。 ### 增量升级方案 + #### 1.代码合并 本地通过svn或git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比合并代码; @@ -11,5 +12,12 @@ - 其他库请手工执行SQL, 目录: `jeecg-module-system\jeecg-system-start\src\main\resources\flyway\sql\mysql` > 注意: 升级sql只提供mysql版本;如果有权限升级, 还需要手工角色授权,退出重新登录才好使。 -#### 3.兼容问题 +#### 3.其他数据库脚本说明 + 原先官方默认提供oracle和SqlServer的脚本,但是维护成本太高,未提供脚本的数据库,可以参考下面的文档自己转 + https://my.oschina.net/jeecg/blog/4905722 + (注意:定时任务的表qrtz_*,需要删掉用原始的脚本重新执行一下) + quartz-2.2.3-distribution.tar.gz放到百度网盘中,大家自己下载,执行所需数据库脚本 + https://pan.baidu.com/s/1WrmZdUuAPg3iBwJ-LoHWyg?pwd=8mdz + +#### 4.兼容问题 每次发版,会针对不兼容地方重点说明。 \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-base-core/pom.xml b/jeecg-boot/jeecg-boot-base-core/pom.xml index 9ad9b1ee919234ec212a43d0e6084168a37364ca..cad35f5e4428adc90bfa2ea28e6e6a16a980d574 100644 --- a/jeecg-boot/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot/jeecg-boot-base-core/pom.xml @@ -4,7 +4,7 @@ org.jeecgframework.boot jeecg-boot-parent - 3.8.0 + 3.8.1 4.0.0 jeecg-boot-base-core @@ -43,7 +43,7 @@ org.jeecgframework.boot - jeecg-boot-common + jeecg-boot-common3 @@ -108,21 +108,32 @@ com.baomidou - mybatis-plus-boot-starter + mybatis-plus-spring-boot3-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-jsqlparser-4.9 + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-jsqlparser-4.9 ${mybatis-plus.version} com.alibaba - druid-spring-boot-starter + druid-spring-boot-3-starter ${druid.version} com.baomidou - dynamic-datasource-spring-boot-starter + dynamic-datasource-spring-boot3-starter ${dynamic-datasource-spring-boot-starter.version} @@ -187,36 +198,38 @@ ${java-jwt.version} - + - org.apache.shiro - shiro-spring-boot-starter - ${shiro.version} + org.springframework.boot + spring-boot-starter-oauth2-authorization-server - - org.crazycake - shiro-redis - ${shiro-redis.version} - - - org.apache.shiro - shiro-core - - - checkstyle - com.puppycrawl.tools - - + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + + org.springframework.security + spring-security-cas - + + com.github.xiaoymin - knife4j-openapi3-spring-boot-starter + knife4j-openapi3-ui ${knife4j-spring-boot-starter.version} - + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.7.0 + + @@ -237,7 +250,7 @@ - org.jeecgframework + org.jeecgframework.boot3 autopoi-web ${autopoi-web.version} @@ -286,6 +299,16 @@ com.xkcoding.justauth justauth-spring-boot-starter + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-configuration-processor + + com.squareup.okhttp3 @@ -312,12 +335,12 @@ org.jeecgframework.boot - jeecg-boot-starter-chatgpt + jeecg-boot-starter3-chatgpt - org.jeecgframework - minidao-spring-boot-starter + org.jeecgframework.boot3 + minidao-spring-boot-starter-jsqlparser-4.9 \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/apache/shiro/SecurityUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/apache/shiro/SecurityUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..dd88d715e971d731afeb948c9b9aebd287294e15 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/apache/shiro/SecurityUtils.java @@ -0,0 +1,21 @@ +package org.apache.shiro; + +import org.apache.shiro.subject.Subject; + +/** + * 兼容处理Online功能使用处理,请勿修改 + * @author eightmonth@qq.com + * @date 2024/4/29 14:05 + */ +public class SecurityUtils { + + + public static Subject getSubject() { + return new Subject() { + @Override + public Object getPrincipal() { + return Subject.super.getPrincipal(); + } + }; + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/apache/shiro/subject/Subject.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/apache/shiro/subject/Subject.java new file mode 100644 index 0000000000000000000000000000000000000000..b5c3aaf1e33a49828c07da2eef485b8623dabbb7 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/apache/shiro/subject/Subject.java @@ -0,0 +1,14 @@ +package org.apache.shiro.subject; + +import org.jeecg.config.security.utils.SecureUtil; + +/** + * 兼容处理Online功能使用处理,请勿修改 + * @author eightmonth@qq.com + * @date 2024/4/29 14:18 + */ +public interface Subject { + default Object getPrincipal() { + return SecureUtil.currentUser(); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java index e087a61e1cabcd2500d79811ad6f977660d1ab52..03b6552206226e95ffc01c05378a9bcd91a5bed3 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java @@ -1,5 +1,6 @@ package org.jeecg.common.api; +import com.alibaba.fastjson.JSONObject; import org.jeecg.common.system.vo.*; import java.util.List; @@ -64,6 +65,13 @@ public interface CommonAPI { */ public String getUserIdByName(String username); + /** + * 5根据用户手机号查询用户信息 + * @param username + * @return + */ + public LoginUser getUserByPhone(String phone); + /** * 6字典表的 翻译 @@ -144,4 +152,31 @@ public interface CommonAPI { List translateDictFromTableByKeys(String table, String text, String code, String keys, String dataSource); //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + /** + * 登录加载系统字典 + * @return + */ + Map> queryAllDictItems(); + + /** + * 查询SysDepart集合 + * @param userId + * @return + */ + List queryUserDeparts(String userId); + + /** + * 根据用户名设置部门ID + * @param username + * @param orgCode + */ + void updateUserDepart(String username,String orgCode,Integer loginTenantId); + + /** + * 设置登录租户 + * @param username + * @return + */ + JSONObject setLoginTenant(String username); + } diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java index 552655c3bc853f7d887cb5d555aadb9fe2cadbd8..c2f744f584f8f805fca37ba75816ba44e616a11d 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java @@ -2,7 +2,7 @@ package org.jeecg.common.api.dto; import lombok.Data; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.Serializable; /** diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java index e07c9d45e58f9d57cbfcff835f5518769891bda8..3d2f569bb22cabeff9de6f82e839c673cfdf8bf8 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java @@ -1,5 +1,6 @@ package org.jeecg.common.aspect; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.PropertyFilter; import org.apache.shiro.SecurityUtils; @@ -15,19 +16,21 @@ import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.enums.ModuleType; import org.jeecg.common.constant.enums.OperateTypeEnum; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.IpUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.StandardReflectionParameterNameDiscoverer; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.validation.BindingResult; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.Resource; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.Date; @@ -100,7 +103,7 @@ public class AutoLogAspect { //设置IP地址 dto.setIp(IpUtils.getIpAddr(request)); //获取登录用户信息 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); if(sysUser!=null){ dto.setUserid(sysUser.getUsername()); dto.setUsername(sysUser.getRealname()); @@ -172,7 +175,7 @@ public class AutoLogAspect { // 请求的方法参数值 Object[] args = joinPoint.getArgs(); // 请求的方法参数名称 - LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer(); + StandardReflectionParameterNameDiscoverer u=new StandardReflectionParameterNameDiscoverer(); String[] paramNames = u.getParameterNames(method); if (args != null && paramNames != null) { for (int i = 0; i < args.length; i++) { diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java index 06575a3e73ec32e85f7d02725730ba64497d2835..d4eeab4aeff8664bd0dcc9b305b3e2916e0ac8cd 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java @@ -21,7 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.List; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java index 2559a2a1f9997136badc5e71793eee5527fdfc23..7fa9a8a3534d0baf350322f675fa8c6bc0250e00 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -90,7 +90,7 @@ public interface CommonConstant { /** 登录用户Shiro权限缓存KEY前缀 */ public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:"; /** 登录用户Token令牌缓存KEY前缀 */ - String PREFIX_USER_TOKEN = "prefix_user_token:"; + String PREFIX_USER_TOKEN = "token::jeecg-client::"; // /** Token缓存时间:3600秒即一小时 */ // int TOKEN_EXPIRE_TIME = 3600; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java index 18965999b249ec58a4ddf113baea8fe7390d3af5..1401a9894895cc30c43f2c51c8e63fcbc8b2510f 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java @@ -1,11 +1,11 @@ package org.jeecg.common.exception; import cn.hutool.core.util.ObjectUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.AuthorizationException; -import org.apache.shiro.authz.UnauthorizedException; import org.jeecg.common.api.dto.LogDTO; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; @@ -22,6 +22,8 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; import org.springframework.data.redis.connection.PoolException; import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.AuthenticationException; import org.springframework.util.CollectionUtils; import org.springframework.validation.ObjectError; import org.springframework.web.HttpRequestMethodNotSupportedException; @@ -32,8 +34,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.servlet.NoHandlerFoundException; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.Map; import java.util.stream.Collectors; @@ -46,9 +46,27 @@ import java.util.stream.Collectors; @RestControllerAdvice @Slf4j public class JeecgBootExceptionHandler { - - @Resource + + @Resource BaseCommonService baseCommonService; + + /** + * 验证码错误异常 + */ + + @ExceptionHandler(JeecgCaptchaException.class) + @ResponseStatus(HttpStatus.OK) + public Result handleJeecgCaptchaException(JeecgCaptchaException e) { + log.error(e.getMessage(), e); + return Result.error(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(AuthenticationException.class) + @ResponseStatus(HttpStatus.OK) + public Result handleJeecgCaptchaException(AuthenticationException e) { + log.error(e.getMessage(), e); + return Result.error(401, e.getMessage()); + } @ExceptionHandler(MethodArgumentNotValidException.class) public Result handleValidationExceptions(MethodArgumentNotValidException e) { @@ -111,8 +129,8 @@ public class JeecgBootExceptionHandler { return Result.error("数据库中已存在该记录"); } - @ExceptionHandler({UnauthorizedException.class, AuthorizationException.class}) - public Result handleAuthorizationException(AuthorizationException e){ + @ExceptionHandler(AccessDeniedException.class) + public Result handleAuthorizationException(AccessDeniedException e){ log.error(e.getMessage(), e); return Result.noauth("没有权限,请联系管理员分配权限!"); } diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgCaptchaException.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgCaptchaException.java new file mode 100644 index 0000000000000000000000000000000000000000..cf2777a390a7df1ed9f077e492736a062e8920ed --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgCaptchaException.java @@ -0,0 +1,28 @@ +package org.jeecg.common.exception; + +import lombok.Data; + +/** + * @author kezhijie@wuhandsj.com + * @date 2024/1/2 11:38 + */ +@Data +public class JeecgCaptchaException extends RuntimeException{ + + private Integer code; + + private static final long serialVersionUID = -9093410345065209053L; + + public JeecgCaptchaException(Integer code, String message) { + super(message); + this.code = code; + } + + public JeecgCaptchaException(String message, Throwable cause) { + super(message, cause); + } + + public JeecgCaptchaException(Throwable cause) { + super(cause); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java index f3ff51edd41182b1692f7a6e1f16fe827d034fc2..b143c4ac545d2e1507428159d668a07aedea67ec 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java @@ -1,17 +1,18 @@ package org.jeecg.common.system.base.controller; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.PropertyUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; @@ -19,13 +20,14 @@ import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; @@ -51,7 +53,7 @@ public class JeecgController> { protected ModelAndView exportXls(HttpServletRequest request, T object, Class clazz, String title) { // Step.1 组装查询条件 QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); // 过滤选中数据 String selections = request.getParameter("selections"); @@ -89,7 +91,7 @@ public class JeecgController> { protected ModelAndView exportXlsSheet(HttpServletRequest request, T object, Class clazz, String title,String exportFields,Integer pageNum) { // Step.1 组装查询条件 QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); // Step.2 计算分页sheet数据 double total = service.count(); int count = (int)Math.ceil(total/pageNum); diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java index 9dc53e545c904d10999ed7cae97d957c60a3f469..66e48cc1f249eff99ea28296e20f6b2a66da7089 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java @@ -5,7 +5,7 @@ import org.jeecg.common.system.vo.SysUserCacheInfo; import org.jeecg.common.util.SpringContextUtils; import org.springframework.util.StringUtils; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java index c6fa09dd1e0129aba2c4c402da421ac7f07b0e19..d5d409e50a787135721f7f4d4dd14ad363a41a2e 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java @@ -1,24 +1,28 @@ package org.jeecg.common.system.util; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.interfaces.DecodedJWT; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Joiner; import java.io.IOException; import java.io.OutputStream; -import java.util.Date; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import java.util.stream.Stream; + +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.CommonAPI; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; @@ -30,6 +34,22 @@ import org.jeecg.common.system.vo.SysUserCacheInfo; import org.jeecg.common.util.DateUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.self.SelfAuthenticationProvider; +import org.jeecg.config.security.self.SelfAuthenticationToken; +import org.jeecg.config.security.utils.SecureUtil; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; +import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder; +import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; /** * @Author Scott @@ -43,6 +63,8 @@ public class JwtUtil { public static final long EXPIRE_TIME = (7 * 12) * 60 * 60 * 1000; static final String WELL_NUMBER = SymbolConstant.WELL_NUMBER + SymbolConstant.LEFT_CURLY_BRACKET; + public static final String DEFAULT_CLIENT = "jeecg-client"; + /** * * @param response @@ -78,10 +100,9 @@ public class JwtUtil { public static boolean verify(String token, String username, String secret) { try { // 根据密码生成JWT效验器 - Algorithm algorithm = Algorithm.HMAC256(secret); - JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build(); + JwtDecoder jwtDecoder = SpringContextUtils.getBean(JwtDecoder.class); // 效验TOKEN - DecodedJWT jwt = verifier.verify(token); + jwtDecoder.decode(token); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -105,17 +126,25 @@ public class JwtUtil { } /** - * 生成签名,5min后过期 + * 生成token * * @param username 用户名 * @param secret 用户的密码 * @return 加密的token */ public static String sign(String username, String secret) { - Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); - Algorithm algorithm = Algorithm.HMAC256(secret); - // 附带username信息 - return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm); + Map additionalParameter = new HashMap<>(); + additionalParameter.put("username", username); + + RegisteredClientRepository registeredClientRepository = SpringContextUtils.getBean(RegisteredClientRepository.class); + SelfAuthenticationProvider selfAuthenticationProvider = SpringContextUtils.getBean(SelfAuthenticationProvider.class); + + OAuth2ClientAuthenticationToken client = new OAuth2ClientAuthenticationToken(Objects.requireNonNull(registeredClientRepository.findByClientId("jeecg-client")), ClientAuthenticationMethod.CLIENT_SECRET_BASIC, null); + client.setAuthenticated(true); + SelfAuthenticationToken selfAuthenticationToken = new SelfAuthenticationToken(client, additionalParameter); + selfAuthenticationToken.setAuthenticated(true); + OAuth2AccessTokenAuthenticationToken accessToken = (OAuth2AccessTokenAuthenticationToken) selfAuthenticationProvider.authenticate(selfAuthenticationToken); + return accessToken.getAccessToken().getTokenValue(); } @@ -180,7 +209,7 @@ public class JwtUtil { //2.通过shiro获取登录用户信息 LoginUser sysUser = null; try { - sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + sysUser = SecureUtil.currentUser(); } catch (Exception e) { log.warn("SecurityUtils.getSubject() 获取用户信息异常:" + e.getMessage()); } diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java index 32d4b493a139676c5cb09c22130ab6b725e38fe7..963ec05bce5b98bfc22ff1074cd2d79384972833 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java @@ -1,13 +1,18 @@ package org.jeecg.common.system.vo; +import com.alibaba.fastjson2.JSON; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.jeecg.common.desensitization.annotation.SensitiveField; import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import java.io.Serializable; import java.util.Date; +import java.util.Set; /** *

@@ -20,8 +25,10 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -public class LoginUser { +public class LoginUser implements Serializable { + + private static final long serialVersionUID = -7143159031677245866L; /** * 登录人id */ @@ -138,4 +145,29 @@ public class LoginUser { /**设备id uniapp推送用*/ private String clientId; + @SensitiveField + private String salt; + + @Override + public String toString() { + // 重新构建对象过滤一些敏感字段 + LoginUser loginUser = new LoginUser(); + loginUser.setId(id); + loginUser.setUsername(username); + loginUser.setRealname(realname); + loginUser.setOrgCode(orgCode); + loginUser.setSex(sex); + loginUser.setEmail(email); + loginUser.setPhone(phone); + loginUser.setDelFlag(delFlag); + loginUser.setStatus(status); + loginUser.setActivitiSync(activitiSync); + loginUser.setUserIdentity(userIdentity); + loginUser.setDepartIds(departIds); + loginUser.setPost(post); + loginUser.setTelephone(telephone); + loginUser.setRelTenantIds(relTenantIds); + loginUser.setClientId(clientId); + return JSON.toJSONString(loginUser); + } } diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java index 08b3fbcb128809b227350abe0a281ad1859c46eb..479a9174b84c2b0a0d4ffd177fd051429bf65e57 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java @@ -5,7 +5,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java index 9294a5c20a446887663d5d862ba5638724db545e..b7e790f489482c93185660765863bf692202e060 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java @@ -19,7 +19,7 @@ import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.util.FileCopyUtils; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import javax.sql.DataSource; import java.io.ByteArrayInputStream; import java.io.File; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FileDownloadUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FileDownloadUtils.java index d9d6ff86b2816454290472fec4fa83d4a81416ad..acdfeb40bfaa2e60739e64793d83aa1f16af73e1 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FileDownloadUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FileDownloadUtils.java @@ -1,10 +1,10 @@ package org.jeecg.common.util; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.jeecg.common.exception.JeecgBootException; -import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URL; import java.net.URLConnection; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FillRuleUtil.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FillRuleUtil.java index d58f8fa3bda5a8f3c5ee6706f373052f0f4f454b..cac263abf001ddbf237220a46c9457d7f5812706 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FillRuleUtil.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FillRuleUtil.java @@ -4,13 +4,13 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.handler.IFillRuleHandler; import org.jeecg.common.system.query.QueryGenerator; -import javax.servlet.http.HttpServletRequest; /** diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java index 22a9395b47e6faa3d346b8171118f933f4bbe952..7add5d2f3daeb929eb2aef9e4c9632f83040793b 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java @@ -1,6 +1,6 @@ package org.jeecg.common.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.CommonConstant; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java index bd46b7d82935181acee0e14f673096a47dabcc28..8a6a4aa4417dee468c211c461d9a2b3aec6ba1b9 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java @@ -1,7 +1,7 @@ package org.jeecg.common.util; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.ServiceNameConstants; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java index 83efa1914b47af250aeac49496ffa8b04a7ab7a1..95ddab7af72cff895acac498c8fbc68490871f85 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java @@ -1,5 +1,6 @@ package org.jeecg.common.util; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.CommonAPI; @@ -11,8 +12,6 @@ import org.jeecg.common.exception.JeecgBoot401Exception; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; -import javax.servlet.http.HttpServletRequest; - /** * @Author scott * @Date 2019/9/23 14:12 @@ -106,8 +105,8 @@ public class TokenUtils { } // 查询用户信息 - LoginUser user = TokenUtils.getLoginUser(username, commonApi, redisUtil); - //LoginUser user = commonApi.getUserByName(username); + //LoginUser user = TokenUtils.getLoginUser(username, commonApi, redisUtil); + LoginUser user = commonApi.getUserByName(username); if (user == null) { throw new JeecgBoot401Exception("用户不存在!"); } @@ -158,10 +157,11 @@ public class TokenUtils { //【重要】此处通过redis原生获取缓存用户,是为了解决微服务下system服务挂了,其他服务互调不通问题--- if (redisUtil.hasKey(loginUserKey)) { try { - loginUser = (LoginUser) redisUtil.get(loginUserKey); + Object obj = redisUtil.get(loginUserKey); + loginUser = (LoginUser) obj; //解密用户 SensitiveInfoUtil.handlerObject(loginUser, false); - } catch (IllegalAccessException e) { + } catch (Exception e) { e.printStackTrace(); } } else { diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java index 6a4db42155d34b02f094d30486bca2e97ff56cd9..e75092cca2ff29129b9ddb3a31d7beb7cc93e55e 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java @@ -1,10 +1,9 @@ package org.jeecg.common.util.encryption; -import org.apache.shiro.lang.codec.Base64; - import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; /** * @Description: AES 加密 @@ -49,7 +48,7 @@ public class AesEncryptUtil { cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encrypted = cipher.doFinal(plaintext); - return Base64.encodeToString(encrypted); + return Base64.getEncoder().encodeToString(encrypted); } catch (Exception e) { e.printStackTrace(); @@ -67,7 +66,7 @@ public class AesEncryptUtil { */ public static String desEncrypt(String data, String key, String iv) throws Exception { //update-begin-author:taoyan date:2022-5-23 for:VUEN-1084 【vue3】online表单测试发现的新问题 6、解密报错 ---解码失败应该把异常抛出去,在外面处理 - byte[] encrypted1 = Base64.decode(data); + byte[] encrypted1 = Base64.getDecoder().decode(data); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java index 11f16b7be75f42c7e1cabdcd9329829ef0dddba2..54c48061bf5782e6b88bc13e329e32ba951bf335 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java @@ -9,7 +9,7 @@ import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; import org.springframework.beans.BeanUtils; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java index 93f571c68c64977f357766a549fc118ab65093f5..a21ab3540a9747f9622fb48c35fdfe0617a7b265 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java @@ -3,7 +3,7 @@ package org.jeecg.config; import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.jeecg.common.api.CommonAPI; import org.jeecg.common.system.vo.DictModel; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java index 7659172bacb16a1fc1ffb8a1182739cf19371d16..84b33f5a5f2914f34de261d7ea2d85a583bc1ca2 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java @@ -2,7 +2,9 @@ package org.jeecg.config; import java.io.IOException; -import javax.servlet.*; +import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure; +import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties; +import jakarta.servlet.*; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -11,8 +13,6 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; -import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; import com.alibaba.druid.util.Utils; /** diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java index 6c3c1a1d933aeb7072854ca5c8ce27bccd6d1763..5dd2d9d4f37913360bac33565492dee17a766f62 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java @@ -12,6 +12,7 @@ import java.util.HashMap; import java.util.Map; /** + * @author eightmonth@qq.com * 启动程序修改DruidWallConfig配置 * 允许SELECT语句的WHERE子句是一个永真条件 * @author eightmonth diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgBaseConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgBaseConfig.java index 0aac0e35c53bae3acdbac8968bf0787edd969844..8dd0093a88d3d76c4aec52c9150a241891e8c7e5 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgBaseConfig.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgBaseConfig.java @@ -1,7 +1,10 @@ package org.jeecg.config; import org.jeecg.config.vo.*; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Role; import org.springframework.stereotype.Component; @@ -11,6 +14,7 @@ import org.springframework.stereotype.Component; */ @Component("jeecgBaseConfig") @ConfigurationProperties(prefix = "jeecg") +@Role(BeanDefinition.ROLE_INFRASTRUCTURE) public class JeecgBaseConfig { /** * 签名密钥串(字典等敏感接口) @@ -36,10 +40,6 @@ public class JeecgBaseConfig { */ private Firewall firewall; - /** - * shiro拦截排除 - */ - private Shiro shiro; /** * 上传文件配置 */ @@ -104,14 +104,6 @@ public class JeecgBaseConfig { this.signatureSecret = signatureSecret; } - public Shiro getShiro() { - return shiro; - } - - public void setShiro(Shiro shiro) { - this.shiro = shiro; - } - public Path getPath() { return path; } diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/UndertowCustomizer.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/UndertowCustomizer.java new file mode 100644 index 0000000000000000000000000000000000000000..afc484b98d323b23149031ec7d56a8266e0ac5d1 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/UndertowCustomizer.java @@ -0,0 +1,19 @@ +package org.jeecg.config; + +import io.undertow.server.DefaultByteBufferPool; +import io.undertow.websockets.jsr.WebSocketDeploymentInfo; +import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.stereotype.Component; + +@Component +public class UndertowCustomizer implements WebServerFactoryCustomizer { + @Override + public void customize(UndertowServletWebServerFactory factory) { + factory.addDeploymentInfoCustomizers(deploymentInfo -> { + WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); + webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 1024)); + deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); + }); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java index 2515f5d030a3e43ddd4498ab98f2606226337ecb..a5d45ab19086c3905c6ccabd6f9d3f756590dbd5 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java @@ -10,20 +10,23 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; -import io.micrometer.prometheus.PrometheusMeterRegistry; +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry; +import jakarta.annotation.Resource; import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository; +import org.springframework.boot.actuate.web.exchanges.InMemoryHttpExchangeRepository; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.jackson.JacksonProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.CacheControl; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @@ -33,7 +36,6 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/RequestBodyReserveFilter.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/RequestBodyReserveFilter.java index fd4f07a943446b142b4c3ef2e22feaa528d7ed52..050c174395aeef3f992ef072c946aa30a06492fd 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/RequestBodyReserveFilter.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/RequestBodyReserveFilter.java @@ -3,8 +3,8 @@ package org.jeecg.config.filter; import org.jeecg.common.constant.CommonConstant; import org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; /** diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java index 55417e153b72fb16b9aedbe83d98833f4830c4fb..b9a788e4c0a718c83914bfd4a89f234b1f23679c 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java @@ -7,9 +7,9 @@ import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.TokenUtils; import org.jeecg.common.util.oConvertUtils; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java index 9bdcbd6439ebe85e982ed51c4be5694f9a7a5b7b..d5f5bb2661ea21a221a551c4484a223b9e25fabe 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java @@ -2,7 +2,6 @@ package org.jeecg.config.firewall.interceptor; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.CommonAPI; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; @@ -11,12 +10,13 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.CommonUtils; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.HandlerInterceptor; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Set; @@ -63,7 +63,7 @@ public class LowCodeModeInterceptor implements HandlerInterceptor { if (jeecgBaseConfig.getFirewall()!=null && LowCodeModeInterceptor.LOW_CODE_MODE_PROD.equals(jeecgBaseConfig.getFirewall().getLowCodeMode())) { String requestURI = request.getRequestURI().substring(request.getContextPath().length()); log.info("低代码模式,拦截请求路径:" + requestURI); - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser loginUser = SecureUtil.currentUser(); Set hasRoles = null; if (loginUser == null) { loginUser = commonAPI.getUserByName(JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest())); diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java index aef226679cd7dd83b0bdd86c6e7dbdc727375c36..5745e1086019d41fdaaecdc752b4f1bcd70ed7f1 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java @@ -6,13 +6,13 @@ import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.plugin.*; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.TenantConstant; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.TokenUtils; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.springframework.stereotype.Component; import java.lang.reflect.Field; @@ -192,7 +192,7 @@ public class MybatisInterceptor implements Interceptor { private LoginUser getLoginUser() { LoginUser sysUser = null; try { - sysUser = SecurityUtils.getSubject().getPrincipal() != null ? (LoginUser) SecurityUtils.getSubject().getPrincipal() : null; + sysUser = SecureUtil.currentUser() != null ? SecureUtil.currentUser() : null; } catch (Exception e) { //e.printStackTrace(); sysUser = null; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java index 2821ac6b1b90e88d2ac6c468fca0cc3efc50b789..fe9099ea840133c8a64e42561bed995b986136a4 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java @@ -6,6 +6,8 @@ import java.util.List; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.TenantConstant; @@ -21,8 +23,6 @@ import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.LongValue; /** * 单数据源配置(jeecg.datasource.open = false时生效) diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/aspect/DynamicTableAspect.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/aspect/DynamicTableAspect.java index b0d67cbcb6f0280f4702c528bdd4d150e1051c3e..df4dc302d6c84ec25c20e1679a4dffe0114696bb 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/aspect/DynamicTableAspect.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/aspect/DynamicTableAspect.java @@ -11,7 +11,7 @@ import org.jeecg.common.util.SpringContextUtils; import org.jeecg.config.mybatis.ThreadLocalDataHelper; import org.springframework.stereotype.Component; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.lang.reflect.Method; /** diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/interceptor/DynamicDatasourceInterceptor.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/interceptor/DynamicDatasourceInterceptor.java index 3461cbd7e7cf68e36bed7fa94b26102b303bbf15..9dfe334291efa81c754bc969eba02939a952458d 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/interceptor/DynamicDatasourceInterceptor.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/interceptor/DynamicDatasourceInterceptor.java @@ -6,8 +6,8 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * 动态数据源切换拦截器 diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java index 3a19ab480d3d4478c29cbbcdbe87cccf0b3110a7..42aff79b3661a4172e18581c83f061288c82f96d 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java @@ -1,5 +1,6 @@ package org.jeecg.config.oss; +import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; @@ -26,7 +27,7 @@ public class MinioConfig { @Value(value = "${jeecg.minio.bucketName}") private String bucketName; - @Bean + @PostConstruct public void initMinio(){ if(!minioUrl.startsWith(CommonConstant.STR_HTTP)){ minioUrl = "http://" + minioUrl; diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java index 0734b95b9ba4b2bd4908f083414a76a0c2c3ec38..b7dd763ad7af2085913cca0eaf1d34db12cff5fb 100644 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java @@ -1,5 +1,6 @@ package org.jeecg.config.oss; +import jakarta.annotation.PostConstruct; import org.jeecg.common.util.oss.OssBootUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -26,7 +27,7 @@ public class OssConfiguration { private String staticDomain; - @Bean + @PostConstruct public void initOssBootConfiguration() { OssBootUtil.setEndPoint(endpoint); OssBootUtil.setAccessKeyId(accessKeyId); diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/ClientService.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/ClientService.java new file mode 100644 index 0000000000000000000000000000000000000000..c13189985c549de690b01604b4dc5954e0f12882 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/ClientService.java @@ -0,0 +1,90 @@ +package org.jeecg.config.security; + +import lombok.AllArgsConstructor; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; +import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat; +import org.springframework.security.oauth2.server.authorization.settings.TokenSettings; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.Set; + +/** + * spring authorization server 注册客户端便捷工具类 + * @author eightmonth@qq.com + * @date 2024/3/7 11:22 + */ +@Component +@AllArgsConstructor +public class ClientService { + + private RegisteredClientRepository registeredClientRepository; + + /** + * 修改客户端token有效期 + * 认证码、设备码有效期与accessToken有效期保持一致 + */ + public void updateTokenValidation(String clientId, Long accessTokenValidation, Long refreshTokenValidation){ + RegisteredClient registeredClient = findByClientId(clientId); + RegisteredClient.Builder builder = RegisteredClient.from(registeredClient); + TokenSettings tokenSettings = TokenSettings.builder() + .idTokenSignatureAlgorithm(SignatureAlgorithm.RS256) + .accessTokenTimeToLive(Duration.ofSeconds(accessTokenValidation)) + .accessTokenFormat(OAuth2TokenFormat.SELF_CONTAINED) + .reuseRefreshTokens(true) + .refreshTokenTimeToLive(Duration.ofSeconds(refreshTokenValidation)) + .authorizationCodeTimeToLive(Duration.ofSeconds(accessTokenValidation)) + .deviceCodeTimeToLive(Duration.ofSeconds(accessTokenValidation)) + .build(); + builder.tokenSettings(tokenSettings); + registeredClientRepository.save(builder.build()); + } + + /** + * 修改客户端授权类型 + * @param clientId + * @param grantTypes + */ + public void updateGrantType(String clientId, Set grantTypes) { + RegisteredClient registeredClient = findByClientId(clientId); + RegisteredClient.Builder builder = RegisteredClient.from(registeredClient); + for (AuthorizationGrantType grantType : grantTypes) { + builder.authorizationGrantType(grantType); + } + registeredClientRepository.save(builder.build()); + } + + /** + * 修改客户端重定向uri + * @param clientId + * @param redirectUris + */ + public void updateRedirectUris(String clientId, String redirectUris) { + RegisteredClient registeredClient = findByClientId(clientId); + RegisteredClient.Builder builder = RegisteredClient.from(registeredClient); + builder.redirectUri(redirectUris); + registeredClientRepository.save(builder.build()); + } + + /** + * 修改客户端授权范围 + * @param clientId + * @param scopes + */ + public void updateScopes(String clientId, Set scopes) { + RegisteredClient registeredClient = findByClientId(clientId); + RegisteredClient.Builder builder = RegisteredClient.from(registeredClient); + for (String scope : scopes) { + builder.scope(scope); + } + registeredClientRepository.save(builder.build()); + } + + public RegisteredClient findByClientId(String clientId) { + return registeredClientRepository.findByClientId(clientId); + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/CopyTokenFilter.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/CopyTokenFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..de18fbeb09acacb983c09b571770a0e2b196ffa2 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/CopyTokenFilter.java @@ -0,0 +1,45 @@ +package org.jeecg.config.security; + +import io.undertow.servlet.spec.HttpServletRequestImpl; +import io.undertow.util.HttpString; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +/** + * 复制仪盘表请求query体携带的token + * @author eightmonth + * @date 2024/7/3 14:04 + */ +@Component +@Order(value = Integer.MIN_VALUE) +public class CopyTokenFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + // 以下为undertow定制代码,如切换其它servlet容器,需要同步更换 + HttpServletRequestImpl undertowRequest = (HttpServletRequestImpl) request; + String token = request.getHeader("Authorization"); + if (StringUtils.hasText(token)) { + undertowRequest.getExchange().getRequestHeaders().remove("Authorization"); + undertowRequest.getExchange().getRequestHeaders().add(new HttpString("Authorization"), "bearer " + token); + } else { + String bearerToken = request.getParameter("token"); + String headerBearerToken = request.getHeader("X-Access-Token"); + if (StringUtils.hasText(bearerToken)) { + undertowRequest.getExchange().getRequestHeaders().add(new HttpString("Authorization"), "bearer " + bearerToken); + } else if (StringUtils.hasText(headerBearerToken)) { + undertowRequest.getExchange().getRequestHeaders().add(new HttpString("Authorization"), "bearer " + headerBearerToken); + } + } + filterChain.doFilter(undertowRequest, response); + } + + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgAuthenticationConvert.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgAuthenticationConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..321f2157892b956b1501b986eb36ad65fda9d727 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgAuthenticationConvert.java @@ -0,0 +1,34 @@ +package org.jeecg.config.security; + +import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.system.vo.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.convert.converter.Converter; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; + +/** + * token只存储用户名与过期时间 + * 这里通过取用户名转全量用户信息存储到Security中 + * @author eightmonth@qq.com + * @date 2024/7/15 11:05 + */ +@Component +public class JeecgAuthenticationConvert implements Converter { + + @Lazy + @Autowired + private CommonAPI commonAPI; + + @Override + public AbstractAuthenticationToken convert(Jwt source) { + String username = source.getClaims().get("username").toString(); + LoginUser loginUser = commonAPI.getUserByName(username); + return new UsernamePasswordAuthenticationToken(loginUser, null, new ArrayList<>()); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgOAuth2AccessTokenGenerator.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgOAuth2AccessTokenGenerator.java new file mode 100644 index 0000000000000000000000000000000000000000..00960db8fa3c1c584cd62a02cacf2e19e98db495 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgOAuth2AccessTokenGenerator.java @@ -0,0 +1,135 @@ +package org.jeecg.config.security; + +import org.jeecg.common.system.util.JwtUtil; +import org.springframework.lang.Nullable; +import org.springframework.security.oauth2.core.ClaimAccessor; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm; +import org.springframework.security.oauth2.jwt.JwsHeader; +import org.springframework.security.oauth2.jwt.JwtClaimsSet; +import org.springframework.security.oauth2.jwt.JwtEncoder; +import org.springframework.security.oauth2.jwt.JwtEncoderParameters; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.token.*; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.time.Duration; +import java.time.Instant; +import java.time.temporal.Temporal; +import java.time.temporal.TemporalUnit; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * @author eightmonth@qq.com + * @date 2024/7/11 17:10 + */ +public class JeecgOAuth2AccessTokenGenerator implements OAuth2TokenGenerator { + private final JwtEncoder jwtEncoder; + + private OAuth2TokenCustomizer accessTokenCustomizer; + + public JeecgOAuth2AccessTokenGenerator(JwtEncoder jwtEncoder) { + this.jwtEncoder = jwtEncoder; + } + + @Nullable + @Override + public OAuth2AccessToken generate(OAuth2TokenContext context) { + if (!OAuth2TokenType.ACCESS_TOKEN.equals(context.getTokenType())) { + return null; + } + + String issuer = null; + if (context.getAuthorizationServerContext() != null) { + issuer = context.getAuthorizationServerContext().getIssuer(); + } + RegisteredClient registeredClient = context.getRegisteredClient(); + + Instant issuedAt = Instant.now(); + Instant expiresAt = issuedAt.plusMillis(JwtUtil.EXPIRE_TIME); + + OAuth2TokenClaimsSet.Builder claimsBuilder = OAuth2TokenClaimsSet.builder(); + if (StringUtils.hasText(issuer)) { + claimsBuilder.issuer(issuer); + } + claimsBuilder + .subject(context.getPrincipal().getName()) + .audience(Collections.singletonList(registeredClient.getClientId())) + .issuedAt(issuedAt) + .expiresAt(expiresAt) + .notBefore(issuedAt) + .id(UUID.randomUUID().toString()); + if (!CollectionUtils.isEmpty(context.getAuthorizedScopes())) { + claimsBuilder.claim(OAuth2ParameterNames.SCOPE, context.getAuthorizedScopes()); + } + + if (this.accessTokenCustomizer != null) { + OAuth2TokenClaimsContext.Builder accessTokenContextBuilder = OAuth2TokenClaimsContext.with(claimsBuilder) + .registeredClient(context.getRegisteredClient()) + .principal(context.getPrincipal()) + .authorizationServerContext(context.getAuthorizationServerContext()) + .authorizedScopes(context.getAuthorizedScopes()) + .tokenType(context.getTokenType()) + .authorizationGrantType(context.getAuthorizationGrantType()); + if (context.getAuthorization() != null) { + accessTokenContextBuilder.authorization(context.getAuthorization()); + } + if (context.getAuthorizationGrant() != null) { + accessTokenContextBuilder.authorizationGrant(context.getAuthorizationGrant()); + } + + OAuth2TokenClaimsContext accessTokenContext = accessTokenContextBuilder.build(); + this.accessTokenCustomizer.customize(accessTokenContext); + } + + + OAuth2TokenClaimsSet accessTokenClaimsSet = claimsBuilder.build(); + OAuth2AuthorizationGrantAuthenticationToken oAuth2ResourceOwnerBaseAuthenticationToken = context.getAuthorizationGrant(); + String username = (String) oAuth2ResourceOwnerBaseAuthenticationToken.getAdditionalParameters().get("username"); + String tokenValue = jwtEncoder.encode(JwtEncoderParameters.from(JwsHeader.with(SignatureAlgorithm.ES256).keyId("jeecg").build(), + JwtClaimsSet.builder().claim("username", username).expiresAt(expiresAt).build())).getTokenValue(); + + //此处可以做改造将tokenValue随机数换成用户信息,方便后续多系统token互通认证(通过解密token得到username) + return new OAuth2AccessTokenClaims(OAuth2AccessToken.TokenType.BEARER, tokenValue, + accessTokenClaimsSet.getIssuedAt(), accessTokenClaimsSet.getExpiresAt(), context.getAuthorizedScopes(), + accessTokenClaimsSet.getClaims()); + } + + /** + * Sets the {@link OAuth2TokenCustomizer} that customizes the + * {@link OAuth2TokenClaimsContext#getClaims() claims} for the + * {@link OAuth2AccessToken}. + * @param accessTokenCustomizer the {@link OAuth2TokenCustomizer} that customizes the + * claims for the {@code OAuth2AccessToken} + */ + public void setAccessTokenCustomizer(OAuth2TokenCustomizer accessTokenCustomizer) { + Assert.notNull(accessTokenCustomizer, "accessTokenCustomizer cannot be null"); + this.accessTokenCustomizer = accessTokenCustomizer; + } + + private static final class OAuth2AccessTokenClaims extends OAuth2AccessToken implements ClaimAccessor { + + private final Map claims; + + private OAuth2AccessTokenClaims(TokenType tokenType, String tokenValue, Instant issuedAt, Instant expiresAt, + Set scopes, Map claims) { + super(tokenType, tokenValue, issuedAt, expiresAt, scopes); + this.claims = claims; + } + + @Override + public Map getClaims() { + return this.claims; + } + + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgPermissionService.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgPermissionService.java new file mode 100644 index 0000000000000000000000000000000000000000..8beaab02f7fcf430ff746b6acdc57298ef511222 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgPermissionService.java @@ -0,0 +1,104 @@ +package org.jeecg.config.security; + +import cn.hutool.core.util.ArrayUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.config.security.utils.SecureUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.util.PatternMatchUtils; +import org.springframework.util.StringUtils; + +import java.util.Arrays; +import java.util.Objects; +import java.util.Set; + +/** + * spring authorization server自定义权限处理,根据@PreAuthorize注解,判断当前用户是否具备权限 + * @author EightMonth + * @date 2024/1/10 17:00 + */ +@Service("jps") +@Slf4j +public class JeecgPermissionService { + private final String SPLIT = "::"; + private final String PERM_PREFIX = "jps" + SPLIT; + + @Lazy + @Autowired + private CommonAPI commonAPI; + @Autowired + private RedisUtil redisUtil; + + /** + * 判断接口是否有任意xxx,xxx权限 + * @param permissions 权限 + * @return {boolean} + */ + public boolean requiresPermissions(String... permissions) { + if (ArrayUtil.isEmpty(permissions)) { + return false; + } + LoginUser loginUser = SecureUtil.currentUser(); + + Object cache = redisUtil.get(buildKey("permission", loginUser.getId())); + Set permissionList; + if (Objects.nonNull(cache)) { + permissionList = (Set) cache; + } else { + permissionList = commonAPI.queryUserAuths(loginUser.getId()); + redisUtil.set(buildKey("permission", loginUser.getId()), permissionList); + } + + boolean pass = permissionList.stream().filter(StringUtils::hasText) + .anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x)); + if (!pass) { + log.error("权限不足,缺少权限:"+ Arrays.toString(permissions)); + } + return pass; + } + + /** + * 判断接口是否有任意xxx,xxx角色 + * @param roles 角色 + * @return {boolean} + */ + public boolean requiresRoles(String... roles) { + if (ArrayUtil.isEmpty(roles)) { + return false; + } + LoginUser loginUser = SecureUtil.currentUser(); + + Object cache = redisUtil.get(buildKey("role", loginUser.getUsername())); + Set roleList; + if (Objects.nonNull(cache)) { + roleList = (Set) cache; + } else { + roleList = commonAPI.queryUserRoles(loginUser.getUsername()); + redisUtil.set(buildKey("role", loginUser.getUsername()), roleList); + } + + boolean pass = roleList.stream().filter(StringUtils::hasText) + .anyMatch(x -> PatternMatchUtils.simpleMatch(roles, x)); + if (!pass) { + log.error("权限不足,缺少角色:" + Arrays.toString(roles)); + } + return pass; + } + + /** + * 由于缓存key是以人的维度,角色列表、权限列表在值中,jeecg是以权限列表绑定在角色上,形成的权限集合 + * 权限发生变更时,需要清理全部人的权限缓存 + */ + public void clearCache() { + redisUtil.removeAll(PERM_PREFIX); + } + + private String buildKey(String type, String username) { + return PERM_PREFIX + type + SPLIT + username; + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgRedisOAuth2AuthorizationConsentService.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgRedisOAuth2AuthorizationConsentService.java new file mode 100644 index 0000000000000000000000000000000000000000..5efb246a0e3e7ddcec00b0c88cae2cd360064612 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgRedisOAuth2AuthorizationConsentService.java @@ -0,0 +1,54 @@ +package org.jeecg.config.security; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsent; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import java.util.concurrent.TimeUnit; + +/** + * spring authorization server 自定义redis保存授权范围信息 + */ +@Component +@RequiredArgsConstructor +public class JeecgRedisOAuth2AuthorizationConsentService implements OAuth2AuthorizationConsentService { + + private final RedisTemplate redisTemplate; + + private final static Long TIMEOUT = 10L; + + @Override + public void save(OAuth2AuthorizationConsent authorizationConsent) { + Assert.notNull(authorizationConsent, "authorizationConsent cannot be null"); + + redisTemplate.opsForValue().set(buildKey(authorizationConsent), authorizationConsent, TIMEOUT, + TimeUnit.MINUTES); + + } + + @Override + public void remove(OAuth2AuthorizationConsent authorizationConsent) { + Assert.notNull(authorizationConsent, "authorizationConsent cannot be null"); + redisTemplate.delete(buildKey(authorizationConsent)); + } + + @Override + public OAuth2AuthorizationConsent findById(String registeredClientId, String principalName) { + Assert.hasText(registeredClientId, "registeredClientId cannot be empty"); + Assert.hasText(principalName, "principalName cannot be empty"); + return (OAuth2AuthorizationConsent) redisTemplate.opsForValue() + .get(buildKey(registeredClientId, principalName)); + } + + private static String buildKey(String registeredClientId, String principalName) { + return "token:consent:" + registeredClientId + ":" + principalName; + } + + private static String buildKey(OAuth2AuthorizationConsent authorizationConsent) { + return buildKey(authorizationConsent.getRegisteredClientId(), authorizationConsent.getPrincipalName()); + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgRedisOAuth2AuthorizationService.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgRedisOAuth2AuthorizationService.java new file mode 100644 index 0000000000000000000000000000000000000000..bdd4a064e22a9bb28a56982208e45f4fb4964231 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/JeecgRedisOAuth2AuthorizationService.java @@ -0,0 +1,192 @@ +package org.jeecg.config.security; + +import cn.hutool.core.collection.CollUtil; +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.lang.Nullable; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.OAuth2RefreshToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationCode; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * spring authorization server自定义redis保存认证信息 + * @author EightMonth + */ +@Component +public class JeecgRedisOAuth2AuthorizationService implements OAuth2AuthorizationService{ + + private final static Long TIMEOUT = 10L; + + private static final String AUTHORIZATION = "token"; + + private final RedisTemplate redisTemplate = new RedisTemplate<>(); + + @Autowired + private RedisConnectionFactory redisConnectionFactory; + + /** + * 因为保存sas的认证信息至redis,无法使用jeecg对redisTemplate的某些设置。 + * 如果在使用时修改redisTemplate属性,会发生线程安全问题,最终容易引起系统无法正常运行。 + * 所以重新建了一个redis client给到sas操作redis,并且该redis实例不注入spring 容器中 + */ + @PostConstruct + public void initSasRedis() { + redisTemplate.setValueSerializer(RedisSerializer.java()); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.afterPropertiesSet(); + } + + @Override + public void save(OAuth2Authorization authorization) { + Assert.notNull(authorization, "authorization cannot be null"); + + if (isState(authorization)) { + String token = authorization.getAttribute("state"); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.STATE, token), authorization, TIMEOUT, + TimeUnit.MINUTES); + } + + if (isCode(authorization)) { + OAuth2Authorization.Token authorizationCode = authorization + .getToken(OAuth2AuthorizationCode.class); + OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); + long between = ChronoUnit.MINUTES.between(authorizationCodeToken.getIssuedAt(), + authorizationCodeToken.getExpiresAt()); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue()), + authorization, between, TimeUnit.MINUTES); + } + + if (isRefreshToken(authorization)) { + OAuth2RefreshToken refreshToken = authorization.getRefreshToken().getToken(); + long between = ChronoUnit.SECONDS.between(refreshToken.getIssuedAt(), refreshToken.getExpiresAt()); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue()), + authorization, between, TimeUnit.SECONDS); + } + + if (isAccessToken(authorization)) { + OAuth2AccessToken accessToken = authorization.getAccessToken().getToken(); + long between = ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt()); + redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), + authorization, between, TimeUnit.SECONDS); + + // 扩展记录 access-token 、username 的关系 1::token::username::admin::xxx + String tokenUsername = String.format("%s::%s::%s", AUTHORIZATION, authorization.getPrincipalName(), accessToken.getTokenValue()); + redisTemplate.opsForValue().set(tokenUsername, accessToken.getTokenValue(), between, TimeUnit.SECONDS); + } + } + + @Override + public void remove(OAuth2Authorization authorization) { + Assert.notNull(authorization, "authorization cannot be null"); + + List keys = new ArrayList<>(); + if (isState(authorization)) { + String token = authorization.getAttribute("state"); + keys.add(buildKey(OAuth2ParameterNames.STATE, token)); + } + + if (isCode(authorization)) { + OAuth2Authorization.Token authorizationCode = authorization + .getToken(OAuth2AuthorizationCode.class); + OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); + keys.add(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue())); + } + + if (isRefreshToken(authorization)) { + OAuth2RefreshToken refreshToken = authorization.getRefreshToken().getToken(); + keys.add(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue())); + } + + if (isAccessToken(authorization)) { + OAuth2AccessToken accessToken = authorization.getAccessToken().getToken(); + keys.add(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue())); + + // 扩展记录 access-token 、username 的关系 1::token::username::admin::xxx + String key = String.format("%s::%s::%s", AUTHORIZATION, authorization.getPrincipalName(), accessToken.getTokenValue()); + keys.add(key); + } + + redisTemplate.delete(keys); + } + + @Override + @Nullable + public OAuth2Authorization findById(String id) { + throw new UnsupportedOperationException(); + } + + @Override + @Nullable + public OAuth2Authorization findByToken(String token, @Nullable OAuth2TokenType tokenType) { + Assert.hasText(token, "token cannot be empty"); + Assert.notNull(tokenType, "tokenType cannot be empty"); + return (OAuth2Authorization) redisTemplate.opsForValue().get(buildKey(tokenType.getValue(), token)); + } + + private String buildKey(String type, String id) { + return String.format("%s::%s::%s", AUTHORIZATION, type, id); + } + + private static boolean isState(OAuth2Authorization authorization) { + return Objects.nonNull(authorization.getAttribute("state")); + } + + private static boolean isCode(OAuth2Authorization authorization) { + OAuth2Authorization.Token authorizationCode = authorization + .getToken(OAuth2AuthorizationCode.class); + return Objects.nonNull(authorizationCode); + } + + private static boolean isRefreshToken(OAuth2Authorization authorization) { + return Objects.nonNull(authorization.getRefreshToken()); + } + + private static boolean isAccessToken(OAuth2Authorization authorization) { + return Objects.nonNull(authorization.getAccessToken()); + } + + /** + * 扩展方法根据 username 查询是否存在存储的 + * @param authentication + * @return + */ + public void removeByUsername(Authentication authentication) { + // 根据 username查询对应access-token + String authenticationName = authentication.getName(); + + // 扩展记录 access-token 、username 的关系 1::token::username::admin::xxx + String tokenUsernameKey = String.format("%s::%s::*", AUTHORIZATION, authenticationName); + Set keys = redisTemplate.keys(tokenUsernameKey); + if (CollUtil.isEmpty(keys)) { + return; + } + + List tokenList = redisTemplate.opsForValue().multiGet(keys); + + for (Object token : tokenList) { + // 根据token 查询存储的 OAuth2Authorization + OAuth2Authorization authorization = this.findByToken((String) token, OAuth2TokenType.ACCESS_TOKEN); + // 根据 OAuth2Authorization 删除相关令牌 + this.remove(authorization); + } + + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/LoginType.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/LoginType.java new file mode 100644 index 0000000000000000000000000000000000000000..26f39a2ed0e344399eb6025473b7abd780b39529 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/LoginType.java @@ -0,0 +1,38 @@ +package org.jeecg.config.security; + +/** + * 登录模式 + * @author EightMonth + * @date 2024/1/10 17:43 + */ +public class LoginType { + + /** + * 密码模式 + */ + public static final String PASSWORD = "password"; + + + /** + * 手机号+验证码模式 + */ + public static final String PHONE = "phone"; + + + /** + * app登录 + */ + public static final String APP = "app"; + + /** + * 扫码登录 + */ + public static final String SCAN = "scan"; + + /** + * 所有联合登录,比如github\钉钉\企业微信\微信 + */ + public static final String SOCIAL = "social"; + + public static final String SELF = "self"; +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/RedisTokenValidationFilter.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/RedisTokenValidationFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..96daa9f28704c9dd6c268b62c01b15f841443927 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/RedisTokenValidationFilter.java @@ -0,0 +1,49 @@ +package org.jeecg.config.security; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import org.jeecg.common.system.util.JwtUtil; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.resource.BearerTokenErrors; +import org.springframework.security.oauth2.server.resource.web.DefaultBearerTokenResolver; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.Objects; + +/** + * 当用户被强退时,使客户端token失效 + * @author eightmonth@qq.com + * @date 2024/3/7 17:30 + */ +@Component +@AllArgsConstructor +public class RedisTokenValidationFilter extends OncePerRequestFilter { + private OAuth2AuthorizationService authorizationService; + private JwtDecoder jwtDecoder; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + // 从请求中获取token + DefaultBearerTokenResolver defaultBearerTokenResolver = new DefaultBearerTokenResolver(); + String token = defaultBearerTokenResolver.resolve(request); + + + if (Objects.nonNull(token)) { + // 检查认证信息是否已被清除,如果已被清除,则令该token失效 + OAuth2Authorization oAuth2Authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + if (Objects.isNull(oAuth2Authorization)) { + throw new OAuth2AuthenticationException(BearerTokenErrors.invalidToken("认证信息已失效,请重新登录")); + } + } + filterChain.doFilter(request, response); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/SecurityConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/SecurityConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..9f8f5310d27cc003dca01313b4dd64528a316439 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/SecurityConfig.java @@ -0,0 +1,249 @@ +package org.jeecg.config.security; + +import com.nimbusds.jose.jwk.Curve; +import com.nimbusds.jose.jwk.ECKey; +import com.nimbusds.jose.jwk.JWKSet; +import com.nimbusds.jose.jwk.source.ImmutableJWKSet; +import com.nimbusds.jose.jwk.source.JWKSource; +import com.nimbusds.jose.proc.SecurityContext; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import org.jeecg.config.security.app.AppGrantAuthenticationConvert; +import org.jeecg.config.security.app.AppGrantAuthenticationProvider; +import org.jeecg.config.security.password.PasswordGrantAuthenticationConvert; +import org.jeecg.config.security.password.PasswordGrantAuthenticationProvider; +import org.jeecg.config.security.phone.PhoneGrantAuthenticationConvert; +import org.jeecg.config.security.phone.PhoneGrantAuthenticationProvider; +import org.jeecg.config.security.social.SocialGrantAuthenticationConvert; +import org.jeecg.config.security.social.SocialGrantAuthenticationProvider; +import org.jeecg.config.shiro.ignore.InMemoryIgnoreAuth; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.http.MediaType; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +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.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.crypto.password.NoOpPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.jwt.NimbusJwtEncoder; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; +import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; +import org.springframework.security.oauth2.server.authorization.token.*; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.security.web.util.matcher.MediaTypeRequestMatcher; +import org.springframework.security.web.util.matcher.RequestMatcher; +import org.springframework.util.CollectionUtils; +import org.springframework.web.cors.CorsConfiguration; + +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.SecureRandom; +import java.security.interfaces.ECPrivateKey; +import java.security.interfaces.ECPublicKey; +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * spring authorization server核心配置 + * @author eightmonth@qq.com + * @date 2024/1/2 9:29 + */ +@Configuration +@EnableWebSecurity +@EnableMethodSecurity +@AllArgsConstructor +public class SecurityConfig { + + private JdbcTemplate jdbcTemplate; + private OAuth2AuthorizationService authorizationService; + private JeecgAuthenticationConvert jeecgAuthenticationConvert; + + @Bean + @Order(1) + public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) + throws Exception { + OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); + // 注册自定义登录类型 + http.getConfigurer(OAuth2AuthorizationServerConfigurer.class) + .tokenEndpoint(tokenEndpoint -> tokenEndpoint.accessTokenRequestConverter(new PasswordGrantAuthenticationConvert()) + .authenticationProvider(new PasswordGrantAuthenticationProvider(authorizationService, tokenGenerator()))) + .tokenEndpoint(tokenEndpoint -> tokenEndpoint.accessTokenRequestConverter(new PhoneGrantAuthenticationConvert()) + .authenticationProvider(new PhoneGrantAuthenticationProvider(authorizationService, tokenGenerator()))) + .tokenEndpoint(tokenEndpoint -> tokenEndpoint.accessTokenRequestConverter(new AppGrantAuthenticationConvert()) + .authenticationProvider(new AppGrantAuthenticationProvider(authorizationService, tokenGenerator()))) + .tokenEndpoint(tokenEndpoint -> tokenEndpoint.accessTokenRequestConverter(new SocialGrantAuthenticationConvert()) + .authenticationProvider(new SocialGrantAuthenticationProvider(authorizationService, tokenGenerator()))) + //开启OpenID Connect 1.0(其中oidc为OpenID Connect的缩写)。 访问 /.well-known/openid-configuration即可获取认证信息 + .oidc(Customizer.withDefaults()); + http + //将需要认证的请求,重定向到login页面行登录认证。 + .exceptionHandling((exceptions) -> exceptions + .defaultAuthenticationEntryPointFor( + new LoginUrlAuthenticationEntryPoint("/sys/login"), + new MediaTypeRequestMatcher(MediaType.TEXT_HTML) + ) + ); + + return http.build(); + } + + @Bean + @Order(2) + public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) + throws Exception { + http + //设置所有请求都需要认证,未认证的请求都被重定向到login页面进行登录 + .authorizeHttpRequests((authorize) -> authorize + .requestMatchers(InMemoryIgnoreAuth.get().stream().map(AntPathRequestMatcher::antMatcher).toList().toArray(new AntPathRequestMatcher[0])).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/cas/client/validateLogin")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/randomImage/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/checkCaptcha")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/login")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/mLogin")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/logout")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/thirdLogin/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/getEncryptedString")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/sms")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/phoneLogin")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/user/checkOnlyUser")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/user/register")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/user/phoneVerification")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/user/passwordChange")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/auth/2step-code")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/common/static/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/common/pdf/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/generic/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/getLoginQrcode/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/getQrcodeToken/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/checkAuth")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/doc.html")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.js")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.css")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.html")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.svg")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.pdf")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.jpg")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.png")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.gif")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.ico")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.ttf")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.woff")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.woff2")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/druid/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/swagger-ui.html")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/swagger**/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/webjars/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/v3/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/WW_verify*")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/sys/annountCement/show/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/jmreport/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.js.map")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/**/*.css.map")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/api/getUserInfo")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/drag/list")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/drag/view")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/drag/onlDragDatasetHead/getLoginUser")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/drag/page/queryById")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/drag/onlDragDatasetHead/getAllChartData")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/drag/onlDragDatasetHead/getTotalData")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/drag/mock/json/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/test/bigScreen/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/bigscreen/visual/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/bigscreen/category/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/bigscreen/map/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/bigscreen/template1/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/bigscreen/template1/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/websocket/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/newsWebsocket/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/vxeSocket/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/test/seata/**")).permitAll() + .requestMatchers(AntPathRequestMatcher.antMatcher("/error")).permitAll() + .anyRequest().authenticated() + ) + .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .cors(cors -> cors + .configurationSource(req -> { + CorsConfiguration config = new CorsConfiguration(); + config.applyPermitDefaultValues(); + config.setAllowedMethods(Arrays.asList("HEAD", "GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); + return config; + })) + .csrf(AbstractHttpConfigurer::disable) + .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(jeecgAuthenticationConvert))); + return http.build(); + } + + /** + * 数据库保存注册客户端信息 + */ + @Bean + public RegisteredClientRepository registeredClientRepository() { + return new JdbcRegisteredClientRepository(jdbcTemplate); + } + + /** + *配置 JWK,为JWT(id_token)提供加密密钥,用于加密/解密或签名/验签 + * JWK详细见:https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-key-41 + */ + @Bean + @SneakyThrows + public JWKSource jwkSource() { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC"); + // 如果不设置secureRandom,会存在一个问题,当应用重启后,原有的token将会全部失效,因为重启的keyPair与之前已经不同 + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); + // 重要!生产环境需要修改! + secureRandom.setSeed("jeecg".getBytes()); + keyPairGenerator.initialize(256, secureRandom); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + ECPublicKey publicKey = (ECPublicKey) keyPair.getPublic(); + ECPrivateKey privateKey = (ECPrivateKey) keyPair.getPrivate(); + + ECKey jwk = new ECKey.Builder(Curve.P_256, publicKey) + .privateKey(privateKey) + .keyID("jeecg") + .build(); + JWKSet jwkSet = new JWKSet(jwk); + return new ImmutableJWKSet<>(jwkSet); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return NoOpPasswordEncoder.getInstance(); + } + + /** + * 配置jwt解析器 + */ + @Bean + public JwtDecoder jwtDecoder(JWKSource jwkSource) { + return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource); + } + + /** + *配置token生成器 + */ + @Bean + OAuth2TokenGenerator tokenGenerator() { + JwtGenerator jwtGenerator = new JwtGenerator(new NimbusJwtEncoder(jwkSource())); + OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator(); + OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator(); + return new DelegatingOAuth2TokenGenerator( + new JeecgOAuth2AccessTokenGenerator(new NimbusJwtEncoder(jwkSource())), + new OAuth2RefreshTokenGenerator() + ); + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationConvert.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..2f081702f45b308ca90fafa64d682d376d56957a --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationConvert.java @@ -0,0 +1,81 @@ +package org.jeecg.config.security.app; + +import jakarta.servlet.http.HttpServletRequest; +import org.jeecg.config.security.LoginType; +import org.jeecg.config.security.password.PasswordGrantAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * APP模式认证转换器 + * @author EightMonth + * @date 2024/1/1 + */ +public class AppGrantAuthenticationConvert implements AuthenticationConverter { + @Override + public Authentication convert(HttpServletRequest request) { + + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (!LoginType.APP.equals(grantType)) { + return null; + } + + Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication(); + + //从request中提取请求参数,然后存入MultiValueMap + MultiValueMap parameters = getParameters(request); + + // username (REQUIRED) + String username = parameters.getFirst(OAuth2ParameterNames.USERNAME); + if (!StringUtils.hasText(username) || + parameters.get(OAuth2ParameterNames.USERNAME).size() != 1) { + throw new OAuth2AuthenticationException("无效请求,用户名不能为空!"); + } + String password = parameters.getFirst(OAuth2ParameterNames.PASSWORD); + if (!StringUtils.hasText(password) || + parameters.get(OAuth2ParameterNames.PASSWORD).size() != 1) { + throw new OAuth2AuthenticationException("无效请求,密码不能为空!"); + } + + //收集要传入PasswordGrantAuthenticationToken构造方法的参数, + //该参数接下来在PasswordGrantAuthenticationProvider中使用 + Map additionalParameters = new HashMap<>(); + //遍历从request中提取的参数,排除掉grant_type、client_id、code等字段参数,其他参数收集到additionalParameters中 + parameters.forEach((key, value) -> { + if (!key.equals(OAuth2ParameterNames.GRANT_TYPE) && + !key.equals(OAuth2ParameterNames.CLIENT_ID) && + !key.equals(OAuth2ParameterNames.CODE)) { + additionalParameters.put(key, value.get(0)); + } + }); + + //返回自定义的PasswordGrantAuthenticationToken对象 + return new PasswordGrantAuthenticationToken(clientPrincipal, additionalParameters); + + } + + /** + *从request中提取请求参数,然后存入MultiValueMap + */ + private static MultiValueMap getParameters(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + MultiValueMap parameters = new LinkedMultiValueMap<>(parameterMap.size()); + parameterMap.forEach((key, values) -> { + if (values.length > 0) { + for (String value : values) { + parameters.add(key, value); + } + } + }); + return parameters; + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationProvider.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..ccf2f03b5aebc6db41a9079484c906f45c8092d6 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationProvider.java @@ -0,0 +1,320 @@ +package org.jeecg.config.security.app; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.constant.CacheConstant; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.exception.JeecgCaptchaException; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.system.vo.SysDepartModel; +import org.jeecg.common.util.Md5Util; +import org.jeecg.common.util.PasswordUtil; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.config.security.password.PasswordGrantAuthenticationToken; +import org.jeecg.modules.base.service.BaseCommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder; +import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +import java.security.Principal; +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * APP模式认证处理器,负责处理该认证模式下的核心逻辑 + * @author EightMonth + * @date 2024/1/1 + */ +@Slf4j +public class AppGrantAuthenticationProvider implements AuthenticationProvider { + + private static final String ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2"; + + private final OAuth2AuthorizationService authorizationService; + private final OAuth2TokenGenerator tokenGenerator; + @Lazy + @Autowired + private CommonAPI commonAPI; + @Autowired + private RedisUtil redisUtil; + @Autowired + private JeecgBaseConfig jeecgBaseConfig; + @Autowired + private BaseCommonService baseCommonService; + + public AppGrantAuthenticationProvider(OAuth2AuthorizationService authorizationService, OAuth2TokenGenerator tokenGenerator) { + Assert.notNull(authorizationService, "authorizationService cannot be null"); + Assert.notNull(tokenGenerator, "tokenGenerator cannot be null"); + this.authorizationService = authorizationService; + this.tokenGenerator = tokenGenerator; + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + AppGrantAuthenticationToken appGrantAuthenticationToken = (AppGrantAuthenticationToken) authentication; + Map additionalParameter = appGrantAuthenticationToken.getAdditionalParameters(); + + // 授权类型 + AuthorizationGrantType authorizationGrantType = appGrantAuthenticationToken.getGrantType(); + // 用户名 + String username = (String) additionalParameter.get(OAuth2ParameterNames.USERNAME); + // 密码 + String password = (String) additionalParameter.get(OAuth2ParameterNames.PASSWORD); + //请求参数权限范围 + String requestScopesStr = (String)additionalParameter.getOrDefault(OAuth2ParameterNames.SCOPE, "*"); + //请求参数权限范围专场集合 + Set requestScopeSet = Stream.of(requestScopesStr.split(" ")).collect(Collectors.toSet()); + // 验证码 + String captcha = (String) additionalParameter.get("captcha"); + String checkKey = (String) additionalParameter.get("checkKey"); + + OAuth2ClientAuthenticationToken clientPrincipal = getAuthenticatedClientElseThrowInvalidClient(appGrantAuthenticationToken); + RegisteredClient registeredClient = clientPrincipal.getRegisteredClient(); + + // 检查登录失败次数 + if(isLoginFailOvertimes(username)){ + Map map = new HashMap<>(); + map.put("message", "该用户登录失败次数过多,请于10分钟后再次登录!"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + if(captcha==null){ + Map map = new HashMap<>(); + map.put("message", "验证码无效"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + String lowerCaseCaptcha = captcha.toLowerCase(); + // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可 + String origin = lowerCaseCaptcha+checkKey+jeecgBaseConfig.getSignatureSecret(); + String realKey = Md5Util.md5Encode(origin, "utf-8"); + Object checkCode = redisUtil.get(realKey); + //当进入登录页时,有一定几率出现验证码错误 #1714 + if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { + Map map = new HashMap<>(); + map.put("message", "验证码错误"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + if (!registeredClient.getAuthorizationGrantTypes().contains(authorizationGrantType)) { + Map map = new HashMap<>(); + map.put("message", "非法登录"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + // 通过用户名获取用户信息 + LoginUser loginUser = commonAPI.getUserByName(username); + //update-begin---author:eightmonth ---date:2024-04-30 for:【6168】master分支切sas分支登录发生错误----------- + if (Objects.isNull(loginUser) || !StringUtils.hasText(loginUser.getSalt())) { + redisUtil.del(CacheConstant.SYS_USERS_CACHE+"::"+username); + loginUser = commonAPI.getUserByName(username); + } + //update-end---author:eightmonth ---date::2024-04-30 for:【6168】master分支切sas分支登录发生错误-------------- + // 检查用户可行性 + checkUserIsEffective(loginUser); + + // 不使用spring security passwordEncoder针对密码进行匹配,使用自有加密匹配,针对 spring security使用noop传输 + password = PasswordUtil.encrypt(username, password, loginUser.getSalt()); + if (!password.equals(loginUser.getPassword())) { + addLoginFailOvertimes(username); + Map map = new HashMap<>(); + map.put("message", "用户名或密码不正确"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + //由于在上面已验证过用户名、密码,现在构建一个已认证的对象UsernamePasswordAuthenticationToken + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = UsernamePasswordAuthenticationToken.authenticated(loginUser,clientPrincipal,new ArrayList<>()); + + DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder() + .registeredClient(registeredClient) + .principal(usernamePasswordAuthenticationToken) + .authorizationServerContext(AuthorizationServerContextHolder.getContext()) + .authorizationGrantType(authorizationGrantType) + .authorizedScopes(requestScopeSet) + .authorizationGrant(appGrantAuthenticationToken); + + OAuth2Authorization.Builder authorizationBuilder = OAuth2Authorization.withRegisteredClient(registeredClient) + .principalName(clientPrincipal.getName()) + .authorizedScopes(requestScopeSet) + .attribute(Principal.class.getName(), username) + .authorizationGrantType(authorizationGrantType); + + + // ----- Access token ----- + OAuth2TokenContext tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.ACCESS_TOKEN).build(); + OAuth2Token generatedAccessToken = this.tokenGenerator.generate(tokenContext); + if (generatedAccessToken == null) { + Map map = new HashMap<>(); + map.put("message", "无法生成访问token,请联系管理系。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, + generatedAccessToken.getTokenValue(), generatedAccessToken.getIssuedAt(), + generatedAccessToken.getExpiresAt(), tokenContext.getAuthorizedScopes()); + if (generatedAccessToken instanceof ClaimAccessor) { + authorizationBuilder.token(accessToken, (metadata) -> { + metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, ((ClaimAccessor) generatedAccessToken).getClaims()); + }); + } else { + authorizationBuilder.accessToken(accessToken); + } + + // ----- Refresh token ----- + OAuth2RefreshToken refreshToken = null; + if (registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.REFRESH_TOKEN) && + // 不向公共客户端颁发刷新令牌 + !clientPrincipal.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) { + + tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.REFRESH_TOKEN).build(); + OAuth2Token generatedRefreshToken = this.tokenGenerator.generate(tokenContext); + if (!(generatedRefreshToken instanceof OAuth2RefreshToken)) { + Map map = new HashMap<>(); + map.put("message", "无法生成刷新token,请联系管理员。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + refreshToken = (OAuth2RefreshToken) generatedRefreshToken; + authorizationBuilder.refreshToken(refreshToken); + } + + OAuth2Authorization authorization = authorizationBuilder.build(); + + // 保存认证信息至redis + authorizationService.save(authorization); + + // 登录成功,删除redis中的验证码 + redisUtil.del(realKey); + redisUtil.del(CommonConstant.LOGIN_FAIL + username); + baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null,loginUser); + + JSONObject addition = new JSONObject(new LinkedHashMap<>()); + addition.put("token", accessToken.getTokenValue()); + // 设置租户 + JSONObject jsonObject = commonAPI.setLoginTenant(username); + addition.putAll(jsonObject.getInnerMap()); + + // 设置登录用户信息 + addition.put("userInfo", loginUser); + addition.put("sysAllDictItems", commonAPI.queryAllDictItems()); + + List departs = commonAPI.queryUserDeparts(loginUser.getId()); + addition.put("departs", departs); + if (departs == null || departs.size() == 0) { + addition.put("multi_depart", 0); + } else if (departs.size() == 1) { + commonAPI.updateUserDepart(username, departs.get(0).getOrgCode(),null); + addition.put("multi_depart", 1); + } else { + //查询当前是否有登录部门 + if(oConvertUtils.isEmpty(loginUser.getOrgCode())){ + commonAPI.updateUserDepart(username, departs.get(0).getOrgCode(),null); + } + addition.put("multi_depart", 2); + } + + // 兼容原有shiro登录结果处理 + Map map = new HashMap<>(); + map.put("result", addition); + map.put("code", 200); + map.put("success", true); + map.put("timestamp", System.currentTimeMillis()); + + // 返回access_token、refresh_token以及其它信息给到前端 + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, accessToken, refreshToken, map); + } + + @Override + public boolean supports(Class authentication) { + return AppGrantAuthenticationToken.class.isAssignableFrom(authentication); + } + + private static OAuth2ClientAuthenticationToken getAuthenticatedClientElseThrowInvalidClient(Authentication authentication) { + OAuth2ClientAuthenticationToken clientPrincipal = null; + if (OAuth2ClientAuthenticationToken.class.isAssignableFrom(authentication.getPrincipal().getClass())) { + clientPrincipal = (OAuth2ClientAuthenticationToken) authentication.getPrincipal(); + } + if (clientPrincipal != null && clientPrincipal.isAuthenticated()) { + return clientPrincipal; + } + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT); + } + + /** + * 登录失败超出次数5 返回true + * @param username + * @return + */ + private boolean isLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + if(failTime!=null){ + Integer val = Integer.parseInt(failTime.toString()); + if(val>5){ + return true; + } + } + return false; + } + + /** + * 记录登录失败次数 + * @param username + */ + private void addLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + Integer val = 0; + if(failTime!=null){ + val = Integer.parseInt(failTime.toString()); + } + // 10分钟 + redisUtil.set(key, ++val, 10); + } + + /** + * 校验用户是否有效 + */ + private void checkUserIsEffective(LoginUser loginUser) { + //情况1:根据用户信息查询,该用户不存在 + if (Objects.isNull(loginUser)) { + baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户不存在,请注册"); + } + //情况2:根据用户信息查询,该用户已注销 + //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + if (CommonConstant.DEL_FLAG_1.equals(loginUser.getDelFlag())) { + //update-end---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已注销!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已注销"); + } + //情况3:根据用户信息查询,该用户已冻结 + if (CommonConstant.USER_FREEZE.equals(loginUser.getStatus())) { + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已冻结!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已冻结"); + } + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationToken.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationToken.java new file mode 100644 index 0000000000000000000000000000000000000000..4ed2a2808ff6309c9494186b58a9e014349b2951 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/app/AppGrantAuthenticationToken.java @@ -0,0 +1,21 @@ +package org.jeecg.config.security.app; + +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; + +import java.util.Map; + +/** + * APP模式认证专用token类型,方法spring authorization server进行认证流转,配合convert使用 + * @author EightMonth + * @date 2024/1/1 + */ +public class AppGrantAuthenticationToken extends OAuth2AuthorizationGrantAuthenticationToken { + + public AppGrantAuthenticationToken(Authentication clientPrincipal, Map additionalParameters) { + super(new AuthorizationGrantType(LoginType.APP), clientPrincipal, additionalParameters); + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationConvert.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..083c4bc8fc566d23c6f7db62adf75c771a262344 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationConvert.java @@ -0,0 +1,82 @@ +package org.jeecg.config.security.password; + +import jakarta.servlet.http.HttpServletRequest; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 密码模式认证转换器 + * @author EightMonth + * @date 2024/1/1 + */ +public class PasswordGrantAuthenticationConvert implements AuthenticationConverter { + @Override + public Authentication convert(HttpServletRequest request) { + + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (!LoginType.PASSWORD.equals(grantType)) { + return null; + } + + Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication(); + + //从request中提取请求参数,然后存入MultiValueMap + MultiValueMap parameters = getParameters(request); + + // username (REQUIRED) + String username = parameters.getFirst(OAuth2ParameterNames.USERNAME); + if (!StringUtils.hasText(username) || + parameters.get(OAuth2ParameterNames.USERNAME).size() != 1) { + throw new OAuth2AuthenticationException("无效请求,用户名不能为空!"); + } + String password = parameters.getFirst(OAuth2ParameterNames.PASSWORD); + if (!StringUtils.hasText(password) || + parameters.get(OAuth2ParameterNames.PASSWORD).size() != 1) { + throw new OAuth2AuthenticationException("无效请求,密码不能为空!"); + } + + //收集要传入PasswordGrantAuthenticationToken构造方法的参数, + //该参数接下来在PasswordGrantAuthenticationProvider中使用 + Map additionalParameters = new HashMap<>(); + //遍历从request中提取的参数,排除掉grant_type、client_id、code等字段参数,其他参数收集到additionalParameters中 + parameters.forEach((key, value) -> { + if (!key.equals(OAuth2ParameterNames.GRANT_TYPE) && + !key.equals(OAuth2ParameterNames.CLIENT_ID) && + !key.equals(OAuth2ParameterNames.CODE)) { + additionalParameters.put(key, value.get(0)); + } + }); + + //返回自定义的PasswordGrantAuthenticationToken对象 + return new PasswordGrantAuthenticationToken(clientPrincipal, additionalParameters); + + } + + /** + *从request中提取请求参数,然后存入MultiValueMap + */ + private static MultiValueMap getParameters(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + MultiValueMap parameters = new LinkedMultiValueMap<>(parameterMap.size()); + parameterMap.forEach((key, values) -> { + if (values.length > 0) { + for (String value : values) { + parameters.add(key, value); + } + } + }); + return parameters; + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationProvider.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..e3341df67fab660285cceb96b7caa9e91219f9ba --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationProvider.java @@ -0,0 +1,319 @@ +package org.jeecg.config.security.password; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.constant.CacheConstant; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.exception.JeecgCaptchaException; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.system.vo.SysDepartModel; +import org.jeecg.common.util.Md5Util; +import org.jeecg.common.util.PasswordUtil; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.modules.base.service.BaseCommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder; +import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +import java.security.Principal; +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 密码模式认证处理器,负责处理该认证模式下的核心逻辑 + * @author EightMonth + * @date 2024/1/1 + */ +@Slf4j +public class PasswordGrantAuthenticationProvider implements AuthenticationProvider { + + private static final String ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2"; + + private final OAuth2AuthorizationService authorizationService; + private final OAuth2TokenGenerator tokenGenerator; + @Lazy + @Autowired + private CommonAPI commonAPI; + @Autowired + private RedisUtil redisUtil; + @Autowired + private JeecgBaseConfig jeecgBaseConfig; + @Autowired + private BaseCommonService baseCommonService; + + public PasswordGrantAuthenticationProvider(OAuth2AuthorizationService authorizationService, OAuth2TokenGenerator tokenGenerator) { + Assert.notNull(authorizationService, "authorizationService cannot be null"); + Assert.notNull(tokenGenerator, "tokenGenerator cannot be null"); + this.authorizationService = authorizationService; + this.tokenGenerator = tokenGenerator; + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + PasswordGrantAuthenticationToken passwordGrantAuthenticationToken = (PasswordGrantAuthenticationToken) authentication; + Map additionalParameter = passwordGrantAuthenticationToken.getAdditionalParameters(); + + // 授权类型 + AuthorizationGrantType authorizationGrantType = passwordGrantAuthenticationToken.getGrantType(); + // 用户名 + String username = (String) additionalParameter.get(OAuth2ParameterNames.USERNAME); + // 密码 + String password = (String) additionalParameter.get(OAuth2ParameterNames.PASSWORD); + //请求参数权限范围 + String requestScopesStr = (String)additionalParameter.getOrDefault(OAuth2ParameterNames.SCOPE, "*"); + //请求参数权限范围专场集合 + Set requestScopeSet = Stream.of(requestScopesStr.split(" ")).collect(Collectors.toSet()); + // 验证码 + String captcha = (String) additionalParameter.get("captcha"); + String checkKey = (String) additionalParameter.get("checkKey"); + + OAuth2ClientAuthenticationToken clientPrincipal = getAuthenticatedClientElseThrowInvalidClient(passwordGrantAuthenticationToken); + RegisteredClient registeredClient = clientPrincipal.getRegisteredClient(); + + // 检查登录失败次数 + if(isLoginFailOvertimes(username)){ + throw new JeecgBootException("该用户登录失败次数过多,请于10分钟后再次登录!"); + } + + if(captcha==null){ + throw new JeecgBootException("验证码无效"); + } + String lowerCaseCaptcha = captcha.toLowerCase(); + // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可 + String origin = lowerCaseCaptcha+checkKey+jeecgBaseConfig.getSignatureSecret(); + String realKey = Md5Util.md5Encode(origin, "utf-8"); + Object checkCode = redisUtil.get(realKey); + //当进入登录页时,有一定几率出现验证码错误 #1714 + if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { + Map map = new HashMap<>(); + map.put("message", "验证码错误"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + if (!registeredClient.getAuthorizationGrantTypes().contains(authorizationGrantType)) { + Map map = new HashMap<>(); + map.put("message", "非法登录"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + // 通过用户名获取用户信息 + LoginUser loginUser = commonAPI.getUserByName(username); + //update-begin---author:eightmonth ---date:2024-04-30 for:【6168】master分支切sas分支登录发生错误----------- + if (Objects.isNull(loginUser) || !StringUtils.hasText(loginUser.getSalt())) { + redisUtil.del(CacheConstant.SYS_USERS_CACHE+"::"+username); + loginUser = commonAPI.getUserByName(username); + } + //update-end---author:eightmonth ---date::2024-04-30 for:【6168】master分支切sas分支登录发生错误-------------- + // 检查用户可行性 + checkUserIsEffective(loginUser); + + // 不使用spring security passwordEncoder针对密码进行匹配,使用自有加密匹配,针对 spring security使用noop传输 + password = PasswordUtil.encrypt(username, password, loginUser.getSalt()); + if (!password.equals(loginUser.getPassword())) { + addLoginFailOvertimes(username); + + Map map = new HashMap<>(); + map.put("message", "用户名或密码不正确"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + //由于在上面已验证过用户名、密码,现在构建一个已认证的对象UsernamePasswordAuthenticationToken + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = UsernamePasswordAuthenticationToken.authenticated(loginUser,clientPrincipal,new ArrayList<>()); + + DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder() + .registeredClient(registeredClient) + .principal(usernamePasswordAuthenticationToken) + .authorizationServerContext(AuthorizationServerContextHolder.getContext()) + .authorizationGrantType(authorizationGrantType) + .authorizedScopes(requestScopeSet) + .authorizationGrant(passwordGrantAuthenticationToken); + + OAuth2Authorization.Builder authorizationBuilder = OAuth2Authorization.withRegisteredClient(registeredClient) + .principalName(clientPrincipal.getName()) + .authorizedScopes(requestScopeSet) + .attribute(Principal.class.getName(), username) + .authorizationGrantType(authorizationGrantType); + + + // ----- Access token ----- + OAuth2TokenContext tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.ACCESS_TOKEN).build(); + OAuth2Token generatedAccessToken = this.tokenGenerator.generate(tokenContext); + if (generatedAccessToken == null) { + Map map = new HashMap<>(); + map.put("message", "无法生成访问token,请联系管理系。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, + generatedAccessToken.getTokenValue(), generatedAccessToken.getIssuedAt(), + generatedAccessToken.getExpiresAt(), tokenContext.getAuthorizedScopes()); + if (generatedAccessToken instanceof ClaimAccessor) { + authorizationBuilder.token(accessToken, (metadata) -> { + metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, ((ClaimAccessor) generatedAccessToken).getClaims()); + }); + } else { + authorizationBuilder.accessToken(accessToken); + } + + // ----- Refresh token ----- + OAuth2RefreshToken refreshToken = null; + if (registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.REFRESH_TOKEN) && + // 不向公共客户端颁发刷新令牌 + !clientPrincipal.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) { + + tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.REFRESH_TOKEN).build(); + OAuth2Token generatedRefreshToken = this.tokenGenerator.generate(tokenContext); + if (!(generatedRefreshToken instanceof OAuth2RefreshToken)) { + Map map = new HashMap<>(); + map.put("message", "无法生成访问token,请联系管理系。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + refreshToken = (OAuth2RefreshToken) generatedRefreshToken; + authorizationBuilder.refreshToken(refreshToken); + } + + OAuth2Authorization authorization = authorizationBuilder.build(); + + // 保存认证信息至redis + authorizationService.save(authorization); + + // 登录成功,删除redis中的验证码 + redisUtil.del(realKey); + redisUtil.del(CommonConstant.LOGIN_FAIL + username); + baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null,loginUser); + + JSONObject addition = new JSONObject(new LinkedHashMap<>()); + addition.put("token", accessToken.getTokenValue()); + + // 设置租户 + JSONObject jsonObject = commonAPI.setLoginTenant(username); + addition.putAll(jsonObject.getInnerMap()); + + // 设置登录用户信息 + addition.put("userInfo", loginUser); + addition.put("sysAllDictItems", commonAPI.queryAllDictItems()); + + List departs = commonAPI.queryUserDeparts(loginUser.getId()); + addition.put("departs", departs); + if (departs == null || departs.size() == 0) { + addition.put("multi_depart", 0); + } else if (departs.size() == 1) { + commonAPI.updateUserDepart(username, departs.get(0).getOrgCode(),null); + addition.put("multi_depart", 1); + } else { + //查询当前是否有登录部门 + if(oConvertUtils.isEmpty(loginUser.getOrgCode())){ + commonAPI.updateUserDepart(username, departs.get(0).getOrgCode(),null); + } + addition.put("multi_depart", 2); + } + + // 兼容原有shiro登录结果处理 + Map map = new HashMap<>(); + map.put("result", addition); + map.put("code", 200); + map.put("success", true); + map.put("timestamp", System.currentTimeMillis()); + + // 返回access_token、refresh_token以及其它信息给到前端 + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, accessToken, refreshToken, map); + } + + @Override + public boolean supports(Class authentication) { + return PasswordGrantAuthenticationToken.class.isAssignableFrom(authentication); + } + + private static OAuth2ClientAuthenticationToken getAuthenticatedClientElseThrowInvalidClient(Authentication authentication) { + OAuth2ClientAuthenticationToken clientPrincipal = null; + if (OAuth2ClientAuthenticationToken.class.isAssignableFrom(authentication.getPrincipal().getClass())) { + clientPrincipal = (OAuth2ClientAuthenticationToken) authentication.getPrincipal(); + } + if (clientPrincipal != null && clientPrincipal.isAuthenticated()) { + return clientPrincipal; + } + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT); + } + + /** + * 登录失败超出次数5 返回true + * @param username + * @return + */ + private boolean isLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + if(failTime!=null){ + Integer val = Integer.parseInt(failTime.toString()); + if(val>5){ + return true; + } + } + return false; + } + + /** + * 记录登录失败次数 + * @param username + */ + private void addLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + Integer val = 0; + if(failTime!=null){ + val = Integer.parseInt(failTime.toString()); + } + // 10分钟 + redisUtil.set(key, ++val, 10); + } + + /** + * 校验用户是否有效 + */ + private void checkUserIsEffective(LoginUser loginUser) { + //情况1:根据用户信息查询,该用户不存在 + if (Objects.isNull(loginUser)) { + baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户不存在,请注册"); + } + //情况2:根据用户信息查询,该用户已注销 + //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + if (CommonConstant.DEL_FLAG_1.equals(loginUser.getDelFlag())) { + //update-end---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已注销!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已注销"); + } + //情况3:根据用户信息查询,该用户已冻结 + if (CommonConstant.USER_FREEZE.equals(loginUser.getStatus())) { + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已冻结!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已冻结"); + } + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationToken.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationToken.java new file mode 100644 index 0000000000000000000000000000000000000000..32d35cfdaf82b263e7c8163f269f5b73d4fc9b5b --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/password/PasswordGrantAuthenticationToken.java @@ -0,0 +1,21 @@ +package org.jeecg.config.security.password; + +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; + +import java.util.Map; + +/** + * 密码模式认证专用token类型,方法spring authorization server进行认证流转,配合convert使用 + * @author EightMonth + * @date 2024/1/1 + */ +public class PasswordGrantAuthenticationToken extends OAuth2AuthorizationGrantAuthenticationToken { + + public PasswordGrantAuthenticationToken(Authentication clientPrincipal, Map additionalParameters) { + super(new AuthorizationGrantType(LoginType.PASSWORD), clientPrincipal, additionalParameters); + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationConvert.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..0c2d2ee2125ac14892e1a3fd0f0b310aba12fc80 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationConvert.java @@ -0,0 +1,77 @@ +package org.jeecg.config.security.phone; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 手机号模式认证转换器 + * @author EightMonth + * @date 2024/1/1 + */ +@AllArgsConstructor +public class PhoneGrantAuthenticationConvert implements AuthenticationConverter { + @Override + public Authentication convert(HttpServletRequest request) { + + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (!LoginType.PHONE.equals(grantType)) { + return null; + } + + Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication(); + + //从request中提取请求参数,然后存入MultiValueMap + MultiValueMap parameters = getParameters(request); + + // 验证码 + String captcha = parameters.getFirst("captcha"); + if (!StringUtils.hasText(captcha)) { + throw new OAuth2AuthenticationException("无效请求,验证码不能为空!"); + } + + //收集要传入PhoneGrantAuthenticationToken构造方法的参数, + //该参数接下来在PhoneGrantAuthenticationProvider中使用 + Map additionalParameters = new HashMap<>(); + //遍历从request中提取的参数,排除掉grant_type、client_id、code等字段参数,其他参数收集到additionalParameters中 + parameters.forEach((key, value) -> { + if (!key.equals(OAuth2ParameterNames.GRANT_TYPE) && + !key.equals(OAuth2ParameterNames.CLIENT_ID) && + !key.equals(OAuth2ParameterNames.CODE)) { + additionalParameters.put(key, value.get(0)); + } + }); + + //返回自定义的PhoneGrantAuthenticationToken对象 + return new PhoneGrantAuthenticationToken(clientPrincipal, additionalParameters); + + } + + /** + *从request中提取请求参数,然后存入MultiValueMap + */ + private static MultiValueMap getParameters(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + MultiValueMap parameters = new LinkedMultiValueMap<>(parameterMap.size()); + parameterMap.forEach((key, values) -> { + if (values.length > 0) { + for (String value : values) { + parameters.add(key, value); + } + } + }); + return parameters; + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationProvider.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..ffe0e36d6c85c494ebe5a0272d72db691fcfe396 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationProvider.java @@ -0,0 +1,292 @@ +package org.jeecg.config.security.phone; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.exception.JeecgCaptchaException; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.system.vo.SysDepartModel; +import org.jeecg.common.util.Md5Util; +import org.jeecg.common.util.PasswordUtil; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.config.security.password.PasswordGrantAuthenticationToken; +import org.jeecg.modules.base.service.BaseCommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpStatus; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder; +import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.util.Assert; + +import java.security.Principal; +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 手机号模式认证处理器,负责处理该认证模式下的核心逻辑 + * @author EightMonth + * @date 2024/1/1 + */ +@Slf4j +public class PhoneGrantAuthenticationProvider implements AuthenticationProvider { + + private static final String ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2"; + + private final OAuth2AuthorizationService authorizationService; + private final OAuth2TokenGenerator tokenGenerator; + @Lazy + @Autowired + private CommonAPI commonAPI; + @Autowired + private RedisUtil redisUtil; + @Autowired + private JeecgBaseConfig jeecgBaseConfig; + @Autowired + private BaseCommonService baseCommonService; + + public PhoneGrantAuthenticationProvider(OAuth2AuthorizationService authorizationService, OAuth2TokenGenerator tokenGenerator) { + Assert.notNull(authorizationService, "authorizationService cannot be null"); + Assert.notNull(tokenGenerator, "tokenGenerator cannot be null"); + this.authorizationService = authorizationService; + this.tokenGenerator = tokenGenerator; + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + PhoneGrantAuthenticationToken phoneGrantAuthenticationToken = (PhoneGrantAuthenticationToken) authentication; + Map additionalParameter = phoneGrantAuthenticationToken.getAdditionalParameters(); + + // 授权类型 + AuthorizationGrantType authorizationGrantType = phoneGrantAuthenticationToken.getGrantType(); + // 手机号 + String phone = (String) additionalParameter.get("mobile"); + + if(isLoginFailOvertimes(phone)){ + throw new JeecgBootException("该用户登录失败次数过多,请于10分钟后再次登录!"); + } + + //请求参数权限范围 + String requestScopesStr = (String)additionalParameter.getOrDefault(OAuth2ParameterNames.SCOPE, "*"); + //请求参数权限范围专场集合 + Set requestScopeSet = Stream.of(requestScopesStr.split(" ")).collect(Collectors.toSet()); + // 验证码 + String captcha = (String) additionalParameter.get("captcha"); + + OAuth2ClientAuthenticationToken clientPrincipal = getAuthenticatedClientElseThrowInvalidClient(phoneGrantAuthenticationToken); + RegisteredClient registeredClient = clientPrincipal.getRegisteredClient(); + + // 通过手机号获取用户信息 + LoginUser loginUser = commonAPI.getUserByPhone(phone); + // 检查用户可行性 + checkUserIsEffective(loginUser); + + + String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone; + Object code = redisUtil.get(redisKey); + + if (!captcha.equals(code)) { + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户 + addLoginFailOvertimes(phone); + + Map map = new HashMap<>(); + map.put("message", "手机验证码错误"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + + } + + if (!registeredClient.getAuthorizationGrantTypes().contains(authorizationGrantType)) { + Map map = new HashMap<>(); + map.put("message", "非法登录"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + //由于在上面已验证过用户名、密码,现在构建一个已认证的对象UsernamePasswordAuthenticationToken + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = UsernamePasswordAuthenticationToken.authenticated(loginUser,clientPrincipal,new ArrayList<>()); + + DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder() + .registeredClient(registeredClient) + .principal(usernamePasswordAuthenticationToken) + .authorizationServerContext(AuthorizationServerContextHolder.getContext()) + .authorizationGrantType(authorizationGrantType) + .authorizedScopes(requestScopeSet) + .authorizationGrant(phoneGrantAuthenticationToken); + + OAuth2Authorization.Builder authorizationBuilder = OAuth2Authorization.withRegisteredClient(registeredClient) + .principalName(clientPrincipal.getName()) + .authorizedScopes(requestScopeSet) + .attribute(Principal.class.getName(), loginUser.getUsername()) + .authorizationGrantType(authorizationGrantType); + + + // ----- Access token ----- + OAuth2TokenContext tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.ACCESS_TOKEN).build(); + OAuth2Token generatedAccessToken = this.tokenGenerator.generate(tokenContext); + if (generatedAccessToken == null) { + Map map = new HashMap<>(); + map.put("message", "无法生成刷新token,请联系管理员。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, + generatedAccessToken.getTokenValue(), generatedAccessToken.getIssuedAt(), + generatedAccessToken.getExpiresAt(), tokenContext.getAuthorizedScopes()); + if (generatedAccessToken instanceof ClaimAccessor) { + authorizationBuilder.token(accessToken, (metadata) -> { + metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, ((ClaimAccessor) generatedAccessToken).getClaims()); + }); + } else { + authorizationBuilder.accessToken(accessToken); + } + + // ----- Refresh token ----- + OAuth2RefreshToken refreshToken = null; + if (registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.REFRESH_TOKEN) && + // 不向公共客户端颁发刷新令牌 + !clientPrincipal.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) { + + tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.REFRESH_TOKEN).build(); + OAuth2Token generatedRefreshToken = this.tokenGenerator.generate(tokenContext); + if (!(generatedRefreshToken instanceof OAuth2RefreshToken)) { + Map map = new HashMap<>(); + map.put("message", "无法生成刷新token,请联系管理员。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + refreshToken = (OAuth2RefreshToken) generatedRefreshToken; + authorizationBuilder.refreshToken(refreshToken); + } + + OAuth2Authorization authorization = authorizationBuilder.build(); + + // 保存认证信息至redis + authorizationService.save(authorization); + + baseCommonService.addLog("用户名: " + loginUser.getUsername() + ",登录成功!", CommonConstant.LOG_TYPE_1, null,loginUser); + + JSONObject addition = new JSONObject(new LinkedHashMap<>()); + addition.put("token", accessToken.getTokenValue()); + // 设置租户 + JSONObject jsonObject = commonAPI.setLoginTenant(loginUser.getUsername()); + addition.putAll(jsonObject.getInnerMap()); + + // 设置登录用户信息 + addition.put("userInfo", loginUser); + addition.put("sysAllDictItems", commonAPI.queryAllDictItems()); + + List departs = commonAPI.queryUserDeparts(loginUser.getId()); + addition.put("departs", departs); + if (departs == null || departs.size() == 0) { + addition.put("multi_depart", 0); + } else if (departs.size() == 1) { + commonAPI.updateUserDepart(loginUser.getUsername(), departs.get(0).getOrgCode(),null); + addition.put("multi_depart", 1); + } else { + //查询当前是否有登录部门 + if(oConvertUtils.isEmpty(loginUser.getOrgCode())){ + commonAPI.updateUserDepart(loginUser.getUsername(), departs.get(0).getOrgCode(),null); + } + addition.put("multi_depart", 2); + } + + // 兼容原有shiro登录结果处理 + Map map = new HashMap<>(); + map.put("result", addition); + map.put("code", 200); + map.put("success", true); + map.put("timestamp", System.currentTimeMillis()); + + // 返回access_token、refresh_token以及其它信息给到前端 + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, accessToken, refreshToken, map); + } + + @Override + public boolean supports(Class authentication) { + return PhoneGrantAuthenticationToken.class.isAssignableFrom(authentication); + } + + private static OAuth2ClientAuthenticationToken getAuthenticatedClientElseThrowInvalidClient(Authentication authentication) { + OAuth2ClientAuthenticationToken clientPrincipal = null; + if (OAuth2ClientAuthenticationToken.class.isAssignableFrom(authentication.getPrincipal().getClass())) { + clientPrincipal = (OAuth2ClientAuthenticationToken) authentication.getPrincipal(); + } + if (clientPrincipal != null && clientPrincipal.isAuthenticated()) { + return clientPrincipal; + } + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT); + } + + /** + * 登录失败超出次数5 返回true + * @param username + * @return + */ + private boolean isLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + if(failTime!=null){ + Integer val = Integer.parseInt(failTime.toString()); + if(val>5){ + return true; + } + } + return false; + } + + /** + * 记录登录失败次数 + * @param username + */ + private void addLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + Integer val = 0; + if(failTime!=null){ + val = Integer.parseInt(failTime.toString()); + } + // 10分钟 + redisUtil.set(key, ++val, 10); + } + + /** + * 校验用户是否有效 + */ + private void checkUserIsEffective(LoginUser loginUser) { + //情况1:根据用户信息查询,该用户不存在 + if (Objects.isNull(loginUser)) { + baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户不存在,请注册"); + } + //情况2:根据用户信息查询,该用户已注销 + //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + if (CommonConstant.DEL_FLAG_1.equals(loginUser.getDelFlag())) { + //update-end---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已注销!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已注销"); + } + //情况3:根据用户信息查询,该用户已冻结 + if (CommonConstant.USER_FREEZE.equals(loginUser.getStatus())) { + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已冻结!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已冻结"); + } + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationToken.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationToken.java new file mode 100644 index 0000000000000000000000000000000000000000..b2f25b7fca4d51ab8d81c5cd0c5a5b17d2d0692e --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/phone/PhoneGrantAuthenticationToken.java @@ -0,0 +1,21 @@ +package org.jeecg.config.security.phone; + +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; + +import java.util.Map; + +/** + * 手机号模式认证专用token类型,方法spring authorization server进行认证流转,配合convert使用 + * @author EightMonth + * @date 2024/1/1 + */ +public class PhoneGrantAuthenticationToken extends OAuth2AuthorizationGrantAuthenticationToken { + + public PhoneGrantAuthenticationToken(Authentication clientPrincipal, Map additionalParameters) { + super(new AuthorizationGrantType(LoginType.PHONE), clientPrincipal, additionalParameters); + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/self/SelfAuthenticationProvider.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/self/SelfAuthenticationProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..c031d427b73e7f2bf8aa6899dc9c884acbea9133 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/self/SelfAuthenticationProvider.java @@ -0,0 +1,187 @@ +package org.jeecg.config.security.self; + +import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBoot401Exception; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.modules.base.service.BaseCommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import java.security.Principal; +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 自用生成token处理器,不对外开放,外部请求无法通过该方式生成token + * @author eightmonth@qq.com + * @date 2024/3/19 11:40 + */ +@Component +public class SelfAuthenticationProvider implements AuthenticationProvider { + + private static final String ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2"; + + private final OAuth2AuthorizationService authorizationService; + private final OAuth2TokenGenerator tokenGenerator; + @Lazy + @Autowired + private CommonAPI commonAPI; + @Autowired + private RedisUtil redisUtil; + @Autowired + private JeecgBaseConfig jeecgBaseConfig; + @Autowired + private BaseCommonService baseCommonService; + + public SelfAuthenticationProvider(OAuth2AuthorizationService authorizationService, OAuth2TokenGenerator tokenGenerator) { + Assert.notNull(authorizationService, "authorizationService cannot be null"); + Assert.notNull(tokenGenerator, "tokenGenerator cannot be null"); + this.authorizationService = authorizationService; + this.tokenGenerator = tokenGenerator; + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + SelfAuthenticationToken passwordGrantAuthenticationToken = (SelfAuthenticationToken) authentication; + Map additionalParameter = passwordGrantAuthenticationToken.getAdditionalParameters(); + + // 授权类型 + AuthorizationGrantType authorizationGrantType = passwordGrantAuthenticationToken.getGrantType(); + // 用户名 + String username = (String) additionalParameter.get(OAuth2ParameterNames.USERNAME); + //请求参数权限范围 + String requestScopesStr = "*"; + //请求参数权限范围专场集合 + Set requestScopeSet = Stream.of(requestScopesStr.split(" ")).collect(Collectors.toSet()); + + OAuth2ClientAuthenticationToken clientPrincipal = getAuthenticatedClientElseThrowInvalidClient(passwordGrantAuthenticationToken); + RegisteredClient registeredClient = clientPrincipal.getRegisteredClient(); + + // 通过用户名获取用户信息 +// LoginUser loginUser = commonAPI.getUserByName(username); + // 检查用户可行性 +// checkUserIsEffective(loginUser); + + //由于在上面已验证过用户名、密码,现在构建一个已认证的对象UsernamePasswordAuthenticationToken + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = UsernamePasswordAuthenticationToken.authenticated(username,clientPrincipal,new ArrayList<>()); + + DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder() + .registeredClient(registeredClient) + .principal(usernamePasswordAuthenticationToken) + .authorizationGrantType(authorizationGrantType) + .authorizedScopes(requestScopeSet) + .authorizationGrant(passwordGrantAuthenticationToken); + + OAuth2Authorization.Builder authorizationBuilder = OAuth2Authorization.withRegisteredClient(registeredClient) + .principalName(clientPrincipal.getName()) + .authorizedScopes(requestScopeSet) + .attribute(Principal.class.getName(), username) + .authorizationGrantType(authorizationGrantType); + + + // ----- Access token ----- + OAuth2TokenContext tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.ACCESS_TOKEN).build(); + OAuth2Token generatedAccessToken = this.tokenGenerator.generate(tokenContext); + if (generatedAccessToken == null) { + throw new JeecgBoot401Exception("无法生成刷新token,请联系管理员。"); + } + OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, + generatedAccessToken.getTokenValue(), generatedAccessToken.getIssuedAt(), + generatedAccessToken.getExpiresAt(), tokenContext.getAuthorizedScopes()); + if (generatedAccessToken instanceof ClaimAccessor) { + authorizationBuilder.token(accessToken, (metadata) -> { + metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, ((ClaimAccessor) generatedAccessToken).getClaims()); + }); + } else { + authorizationBuilder.accessToken(accessToken); + } + +// ----- Refresh token ----- + OAuth2RefreshToken refreshToken = null; + if (registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.REFRESH_TOKEN) && + // 不向公共客户端颁发刷新令牌 + !clientPrincipal.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) { + + tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.REFRESH_TOKEN).build(); + OAuth2Token generatedRefreshToken = this.tokenGenerator.generate(tokenContext); + if (!(generatedRefreshToken instanceof OAuth2RefreshToken)) { + Map map = new HashMap<>(); + map.put("message", "无法生成刷新token,请联系管理员。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + refreshToken = (OAuth2RefreshToken) generatedRefreshToken; + authorizationBuilder.refreshToken(refreshToken); + } + + OAuth2Authorization authorization = authorizationBuilder.build(); + + // 保存认证信息至redis + authorizationService.save(authorization); + + // 返回access_token、refresh_token以及其它信息给到前端 + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, accessToken); + } + + @Override + public boolean supports(Class authentication) { + return SelfAuthenticationToken.class.isAssignableFrom(authentication); + } + + private static OAuth2ClientAuthenticationToken getAuthenticatedClientElseThrowInvalidClient(Authentication authentication) { + OAuth2ClientAuthenticationToken clientPrincipal = null; + if (OAuth2ClientAuthenticationToken.class.isAssignableFrom(authentication.getPrincipal().getClass())) { + clientPrincipal = (OAuth2ClientAuthenticationToken) authentication.getPrincipal(); + } + if (clientPrincipal != null && clientPrincipal.isAuthenticated()) { + return clientPrincipal; + } + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT); + } + + /** + * 校验用户是否有效 + */ + private void checkUserIsEffective(LoginUser loginUser) { + //情况1:根据用户信息查询,该用户不存在 + if (Objects.isNull(loginUser)) { + baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户不存在,请注册"); + } + //情况2:根据用户信息查询,该用户已注销 + //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + if (CommonConstant.DEL_FLAG_1.equals(loginUser.getDelFlag())) { + //update-end---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已注销!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已注销"); + } + //情况3:根据用户信息查询,该用户已冻结 + if (CommonConstant.USER_FREEZE.equals(loginUser.getStatus())) { + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已冻结!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已冻结"); + } + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/self/SelfAuthenticationToken.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/self/SelfAuthenticationToken.java new file mode 100644 index 0000000000000000000000000000000000000000..7a036ddf154a262ac236bf5fd084e94fb65133ea --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/self/SelfAuthenticationToken.java @@ -0,0 +1,19 @@ +package org.jeecg.config.security.self; + +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; + +import java.util.Map; + +/** + * 自用生成token,不支持对外请求,仅为程序内部生成token + * @author eightmonth + * @date 2024/3/19 11:37 + */ +public class SelfAuthenticationToken extends OAuth2AuthorizationGrantAuthenticationToken { + public SelfAuthenticationToken(Authentication clientPrincipal, Map additionalParameters) { + super(new AuthorizationGrantType(LoginType.SELF), clientPrincipal, additionalParameters); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationConvert.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..142af6f1a84bb82e0bf3f09d1ccdcaf5d74afa18 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationConvert.java @@ -0,0 +1,81 @@ +package org.jeecg.config.security.social; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.web.authentication.AuthenticationConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 社交模式认证转换器,配合github、企业微信、钉钉、微信登录使用 + * @author EightMonth + * @date 2024/1/1 + */ +@AllArgsConstructor +public class SocialGrantAuthenticationConvert implements AuthenticationConverter { + @Override + public Authentication convert(HttpServletRequest request) { + + String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE); + if (!LoginType.SOCIAL.equals(grantType)) { + return null; + } + + Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication(); + + //从request中提取请求参数,然后存入MultiValueMap + MultiValueMap parameters = getParameters(request); + + String token = parameters.getFirst("token"); + if (!StringUtils.hasText(token)) { + throw new OAuth2AuthenticationException("无效请求,三方token不能为空!"); + } + + String source = parameters.getFirst("thirdType"); + if (!StringUtils.hasText(source)) { + throw new OAuth2AuthenticationException("无效请求,三方来源不能为空!"); + } + + //收集要传入PhoneGrantAuthenticationToken构造方法的参数, + //该参数接下来在PhoneGrantAuthenticationProvider中使用 + Map additionalParameters = new HashMap<>(); + //遍历从request中提取的参数,排除掉grant_type、client_id、code等字段参数,其他参数收集到additionalParameters中 + parameters.forEach((key, value) -> { + if (!key.equals(OAuth2ParameterNames.GRANT_TYPE) && + !key.equals(OAuth2ParameterNames.CLIENT_ID) && + !key.equals(OAuth2ParameterNames.CODE)) { + additionalParameters.put(key, value.get(0)); + } + }); + + //返回自定义的PhoneGrantAuthenticationToken对象 + return new SocialGrantAuthenticationToken(clientPrincipal, additionalParameters); + + } + + /** + *从request中提取请求参数,然后存入MultiValueMap + */ + private static MultiValueMap getParameters(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + MultiValueMap parameters = new LinkedMultiValueMap<>(parameterMap.size()); + parameterMap.forEach((key, values) -> { + if (values.length > 0) { + for (String value : values) { + parameters.add(key, value); + } + } + }); + return parameters; + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationProvider.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..74847827bedec329f7100d5a7343a4fc70e88b2e --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationProvider.java @@ -0,0 +1,278 @@ +package org.jeecg.config.security.social; + +import com.alibaba.fastjson.JSONObject; +import com.auth0.jwt.JWT; +import com.auth0.jwt.interfaces.DecodedJWT; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.CommonAPI; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.system.vo.SysDepartModel; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.config.security.password.PasswordGrantAuthenticationToken; +import org.jeecg.modules.base.service.BaseCommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.core.*; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder; +import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; +import org.springframework.util.Assert; + +import java.security.Principal; +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 社交模式认证处理器,负责处理该认证模式下的核心逻辑,配合github、企业微信、钉钉、微信登录使用 + * @author EightMonth + * @date 2024/1/1 + */ +@Slf4j +public class SocialGrantAuthenticationProvider implements AuthenticationProvider { + + private static final String ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2"; + + private final OAuth2AuthorizationService authorizationService; + private final OAuth2TokenGenerator tokenGenerator; + @Lazy + @Autowired + private CommonAPI commonAPI; + @Autowired + private RedisUtil redisUtil; + @Autowired + private JeecgBaseConfig jeecgBaseConfig; + @Autowired + private BaseCommonService baseCommonService; + + public SocialGrantAuthenticationProvider(OAuth2AuthorizationService authorizationService, OAuth2TokenGenerator tokenGenerator) { + Assert.notNull(authorizationService, "authorizationService cannot be null"); + Assert.notNull(tokenGenerator, "tokenGenerator cannot be null"); + this.authorizationService = authorizationService; + this.tokenGenerator = tokenGenerator; + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + SocialGrantAuthenticationToken socialGrantAuthenticationToken = (SocialGrantAuthenticationToken) authentication; + Map additionalParameter = socialGrantAuthenticationToken.getAdditionalParameters(); + + // 授权类型 + AuthorizationGrantType authorizationGrantType = socialGrantAuthenticationToken.getGrantType(); + // 三方token + String token = (String) additionalParameter.get("token"); + // 三方来源 + String source = (String) additionalParameter.get("thirdType"); + + //请求参数权限范围 + String requestScopesStr = (String)additionalParameter.getOrDefault(OAuth2ParameterNames.SCOPE, "*"); + //请求参数权限范围专场集合 + Set requestScopeSet = Stream.of(requestScopesStr.split(" ")).collect(Collectors.toSet()); + + DecodedJWT jwt = JWT.decode(token); + String username = jwt.getClaim("username").asString(); + + // 通过手机号获取用户信息 + LoginUser loginUser = commonAPI.getUserByName(username); + // 检查用户可行性 + checkUserIsEffective(loginUser); + + OAuth2ClientAuthenticationToken clientPrincipal = getAuthenticatedClientElseThrowInvalidClient(socialGrantAuthenticationToken); + RegisteredClient registeredClient = clientPrincipal.getRegisteredClient(); + + if (!registeredClient.getAuthorizationGrantTypes().contains(authorizationGrantType)) { + Map map = new HashMap<>(); + map.put("message", "非法登录"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + + } + + //由于在上面已验证过用户名、密码,现在构建一个已认证的对象UsernamePasswordAuthenticationToken + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = UsernamePasswordAuthenticationToken.authenticated(loginUser,clientPrincipal,new ArrayList<>()); + + DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder() + .registeredClient(registeredClient) + .principal(usernamePasswordAuthenticationToken) + .authorizationServerContext(AuthorizationServerContextHolder.getContext()) + .authorizationGrantType(authorizationGrantType) + .authorizedScopes(requestScopeSet) + .authorizationGrant(socialGrantAuthenticationToken); + + OAuth2Authorization.Builder authorizationBuilder = OAuth2Authorization.withRegisteredClient(registeredClient) + .principalName(clientPrincipal.getName()) + .authorizedScopes(requestScopeSet) + .attribute(Principal.class.getName(), loginUser.getUsername()) + .authorizationGrantType(authorizationGrantType); + + + // ----- Access token ----- + OAuth2TokenContext tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.ACCESS_TOKEN).build(); + OAuth2Token generatedAccessToken = this.tokenGenerator.generate(tokenContext); + if (generatedAccessToken == null) { + Map map = new HashMap<>(); + map.put("message", "无法生成访问token,请联系管理系。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + + } + OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, + generatedAccessToken.getTokenValue(), generatedAccessToken.getIssuedAt(), + generatedAccessToken.getExpiresAt(), tokenContext.getAuthorizedScopes()); + if (generatedAccessToken instanceof ClaimAccessor) { + authorizationBuilder.token(accessToken, (metadata) -> { + metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, ((ClaimAccessor) generatedAccessToken).getClaims()); + }); + } else { + authorizationBuilder.accessToken(accessToken); + } + + // ----- Refresh token ----- + OAuth2RefreshToken refreshToken = null; + if (registeredClient.getAuthorizationGrantTypes().contains(AuthorizationGrantType.REFRESH_TOKEN) && + // 不向公共客户端颁发刷新令牌 + !clientPrincipal.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.NONE)) { + + tokenContext = tokenContextBuilder.tokenType(OAuth2TokenType.REFRESH_TOKEN).build(); + OAuth2Token generatedRefreshToken = this.tokenGenerator.generate(tokenContext); + if (!(generatedRefreshToken instanceof OAuth2RefreshToken)) { + Map map = new HashMap<>(); + map.put("message", "无法生成刷新token,请联系管理员。"); + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,"fdsafas", Instant.now(), Instant.now().plusNanos(1)), null, map); + } + + refreshToken = (OAuth2RefreshToken) generatedRefreshToken; + authorizationBuilder.refreshToken(refreshToken); + } + + OAuth2Authorization authorization = authorizationBuilder.build(); + + // 保存认证信息至redis + authorizationService.save(authorization); + + baseCommonService.addLog("用户名: " + loginUser.getUsername() + ",登录成功!", CommonConstant.LOG_TYPE_1, null,loginUser); + + JSONObject addition = new JSONObject(new LinkedHashMap<>()); + addition.put("token", accessToken.getTokenValue()); + // 设置租户 + JSONObject jsonObject = commonAPI.setLoginTenant(loginUser.getUsername()); + addition.putAll(jsonObject.getInnerMap()); + + // 设置登录用户信息 + addition.put("userInfo", loginUser); + addition.put("sysAllDictItems", commonAPI.queryAllDictItems()); + + List departs = commonAPI.queryUserDeparts(loginUser.getId()); + addition.put("departs", departs); + if (departs == null || departs.size() == 0) { + addition.put("multi_depart", 0); + } else if (departs.size() == 1) { + commonAPI.updateUserDepart(loginUser.getUsername(), departs.get(0).getOrgCode(),null); + addition.put("multi_depart", 1); + } else { + //查询当前是否有登录部门 + if(oConvertUtils.isEmpty(loginUser.getOrgCode())){ + commonAPI.updateUserDepart(loginUser.getUsername(), departs.get(0).getOrgCode(),null); + } + addition.put("multi_depart", 2); + } + + // 兼容原有shiro登录结果处理 + Map map = new HashMap<>(); + map.put("result", addition); + map.put("code", 200); + map.put("success", true); + map.put("timestamp", System.currentTimeMillis()); + + + // 返回access_token、refresh_token以及其它信息给到前端 + return new OAuth2AccessTokenAuthenticationToken(registeredClient, clientPrincipal, accessToken, refreshToken, map); + } + + @Override + public boolean supports(Class authentication) { + return SocialGrantAuthenticationToken.class.isAssignableFrom(authentication); + } + + private static OAuth2ClientAuthenticationToken getAuthenticatedClientElseThrowInvalidClient(Authentication authentication) { + OAuth2ClientAuthenticationToken clientPrincipal = null; + if (OAuth2ClientAuthenticationToken.class.isAssignableFrom(authentication.getPrincipal().getClass())) { + clientPrincipal = (OAuth2ClientAuthenticationToken) authentication.getPrincipal(); + } + if (clientPrincipal != null && clientPrincipal.isAuthenticated()) { + return clientPrincipal; + } + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT); + } + + /** + * 登录失败超出次数5 返回true + * @param username + * @return + */ + private boolean isLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + if(failTime!=null){ + Integer val = Integer.parseInt(failTime.toString()); + if(val>5){ + return true; + } + } + return false; + } + + /** + * 记录登录失败次数 + * @param username + */ + private void addLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + Integer val = 0; + if(failTime!=null){ + val = Integer.parseInt(failTime.toString()); + } + // 10分钟 + redisUtil.set(key, ++val, 10); + } + + /** + * 校验用户是否有效 + */ + private void checkUserIsEffective(LoginUser loginUser) { + //情况1:根据用户信息查询,该用户不存在 + if (Objects.isNull(loginUser)) { + baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户不存在,请注册"); + } + //情况2:根据用户信息查询,该用户已注销 + //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + if (CommonConstant.DEL_FLAG_1.equals(loginUser.getDelFlag())) { + //update-end---author:王帅 Date:20200601 for:if条件永远为falsebug------------ + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已注销!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已注销"); + } + //情况3:根据用户信息查询,该用户已冻结 + if (CommonConstant.USER_FREEZE.equals(loginUser.getStatus())) { + baseCommonService.addLog("用户登录失败,用户名:" + loginUser.getUsername() + "已冻结!", CommonConstant.LOG_TYPE_1, null); + throw new JeecgBootException("该用户已冻结"); + } + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationToken.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationToken.java new file mode 100644 index 0000000000000000000000000000000000000000..7ff4f37c9cfb8bbc68634a4c42961715a5654470 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/social/SocialGrantAuthenticationToken.java @@ -0,0 +1,21 @@ +package org.jeecg.config.security.social; + +import org.jeecg.config.security.LoginType; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; + +import java.util.Map; + +/** + * 社交模式认证专用token类型,方法spring authorization server进行认证流转,配合convert使用,配合github、企业微信、钉钉、微信登录使用 + * @author EightMonth + * @date 2024/1/1 + */ +public class SocialGrantAuthenticationToken extends OAuth2AuthorizationGrantAuthenticationToken { + + public SocialGrantAuthenticationToken(Authentication clientPrincipal, Map additionalParameters) { + super(new AuthorizationGrantType(LoginType.SOCIAL), clientPrincipal, additionalParameters); + } + +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/utils/SecureUtil.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/utils/SecureUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..60b1d5f525a11bdfc599402a7729d42bc0ff1810 --- /dev/null +++ b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/security/utils/SecureUtil.java @@ -0,0 +1,23 @@ +package org.jeecg.config.security.utils; + +import com.alibaba.fastjson2.JSONObject; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.SpringContextUtils; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * 认证信息工具类 + * @author EightMonth + * @date 2024/1/10 17:03 + */ +public class SecureUtil { + + /** + * 通过当前认证信息获取用户信息 + * @return + */ + public static LoginUser currentUser() { + String name = SecurityContextHolder.getContext().getAuthentication().getName(); + return JSONObject.parseObject(name, LoginUser.class); + } +} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/JwtToken.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/JwtToken.java deleted file mode 100644 index 0507c54164e140b19b82784fa96a413ef7069020..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/JwtToken.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.jeecg.config.shiro; - -import org.apache.shiro.authc.AuthenticationToken; - -/** - * @Author Scott - * @create 2018-07-12 15:19 - * @desc - **/ -public class JwtToken implements AuthenticationToken { - - private static final long serialVersionUID = 1L; - private String token; - - public JwtToken(String token) { - this.token = token; - } - - @Override - public Object getPrincipal() { - return token; - } - - @Override - public Object getCredentials() { - return token; - } -} diff --git a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java deleted file mode 100644 index e2a68a965035cf8da4e9ceefa801c62697ba47aa..0000000000000000000000000000000000000000 --- a/jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ /dev/null @@ -1,370 +0,0 @@ -package org.jeecg.config.shiro; - -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; -import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; -import org.apache.shiro.mgt.DefaultSubjectDAO; -import org.apache.shiro.mgt.SecurityManager; -import org.apache.shiro.spring.LifecycleBeanPostProcessor; -import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; -import org.apache.shiro.spring.web.ShiroFilterFactoryBean; -import org.apache.shiro.web.mgt.DefaultWebSecurityManager; -import org.crazycake.shiro.*; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.util.oConvertUtils; -import org.jeecg.config.JeecgBaseConfig; -import org.jeecg.config.shiro.filters.CustomShiroFilterFactoryBean; -import org.jeecg.config.shiro.filters.JwtFilter; -import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.*; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.env.Environment; -import org.springframework.core.type.filter.AnnotationTypeFilter; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.filter.DelegatingFilterProxy; -import redis.clients.jedis.HostAndPort; -import redis.clients.jedis.JedisCluster; - -import javax.annotation.Resource; -import javax.servlet.DispatcherType; -import javax.servlet.Filter; -import java.lang.reflect.Method; -import java.util.*; - -/** - * @author: Scott - * @date: 2018/2/7 - * @description: shiro 配置类 - */ - -@Slf4j -@Configuration -public class ShiroConfig { - - @Resource - private LettuceConnectionFactory lettuceConnectionFactory; - @Autowired - private Environment env; - @Resource - private JeecgBaseConfig jeecgBaseConfig; - @Autowired(required = false) - private RedisProperties redisProperties; - - /** - * Filter Chain定义说明 - * - * 1、一个URL可以配置多个Filter,使用逗号分隔 - * 2、当设置多个过滤器时,全部验证通过,才视为通过 - * 3、部分过滤器可指定参数,如perms,roles - */ - @Bean("shiroFilterFactoryBean") - public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { - CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean(); - shiroFilterFactoryBean.setSecurityManager(securityManager); - // 拦截器 - Map filterChainDefinitionMap = new LinkedHashMap(); - - //支持yml方式,配置拦截排除 - if(jeecgBaseConfig!=null && jeecgBaseConfig.getShiro()!=null){ - String shiroExcludeUrls = jeecgBaseConfig.getShiro().getExcludeUrls(); - if(oConvertUtils.isNotEmpty(shiroExcludeUrls)){ - String[] permissionUrl = shiroExcludeUrls.split(","); - for(String url : permissionUrl){ - filterChainDefinitionMap.put(url,"anon"); - } - } - } - - // 配置不会被拦截的链接 顺序判断 - filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); //cas验证登录 - filterChainDefinitionMap.put("/sys/randomImage/**", "anon"); //登录验证码接口排除 - filterChainDefinitionMap.put("/sys/checkCaptcha", "anon"); //登录验证码接口排除 - filterChainDefinitionMap.put("/sys/smsCheckCaptcha", "anon"); //短信次数发送太多验证码排除 - filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除 - filterChainDefinitionMap.put("/sys/mLogin", "anon"); //登录接口排除 - filterChainDefinitionMap.put("/sys/logout", "anon"); //登出接口排除 - filterChainDefinitionMap.put("/sys/thirdLogin/**", "anon"); //第三方登录 - filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //获取加密串 - filterChainDefinitionMap.put("/sys/sms", "anon");//短信验证码 - filterChainDefinitionMap.put("/sys/phoneLogin", "anon");//手机登录 - filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");//校验用户是否存在 - filterChainDefinitionMap.put("/sys/user/register", "anon");//用户注册 - filterChainDefinitionMap.put("/sys/user/phoneVerification", "anon");//用户忘记密码验证手机号 - filterChainDefinitionMap.put("/sys/user/passwordChange", "anon");//用户更改密码 - filterChainDefinitionMap.put("/auth/2step-code", "anon");//登录验证码 - filterChainDefinitionMap.put("/sys/common/static/**", "anon");//图片预览 &下载文件不限制token - filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf预览 - - //filterChainDefinitionMap.put("/sys/common/view/**", "anon");//图片预览不限制token - //filterChainDefinitionMap.put("/sys/common/download/**", "anon");//文件下载不限制token - filterChainDefinitionMap.put("/generic/**", "anon");//pdf预览需要文件 - - filterChainDefinitionMap.put("/sys/getLoginQrcode/**", "anon"); //登录二维码 - filterChainDefinitionMap.put("/sys/getQrcodeToken/**", "anon"); //监听扫码 - filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //授权接口排除 - - - //update-begin--Author:scott Date:20221116 for:排除静态资源后缀 - filterChainDefinitionMap.put("/", "anon"); - filterChainDefinitionMap.put("/doc.html", "anon"); - filterChainDefinitionMap.put("/**/*.js", "anon"); - filterChainDefinitionMap.put("/**/*.css", "anon"); - filterChainDefinitionMap.put("/**/*.html", "anon"); - filterChainDefinitionMap.put("/**/*.svg", "anon"); - filterChainDefinitionMap.put("/**/*.pdf", "anon"); - filterChainDefinitionMap.put("/**/*.jpg", "anon"); - filterChainDefinitionMap.put("/**/*.png", "anon"); - filterChainDefinitionMap.put("/**/*.gif", "anon"); - filterChainDefinitionMap.put("/**/*.ico", "anon"); - filterChainDefinitionMap.put("/**/*.ttf", "anon"); - filterChainDefinitionMap.put("/**/*.woff", "anon"); - filterChainDefinitionMap.put("/**/*.woff2", "anon"); - filterChainDefinitionMap.put("/**/*.glb", "anon"); - filterChainDefinitionMap.put("/**/*.wasm", "anon"); - //update-end--Author:scott Date:20221116 for:排除静态资源后缀 - - filterChainDefinitionMap.put("/druid/**", "anon"); - filterChainDefinitionMap.put("/swagger-ui.html", "anon"); - filterChainDefinitionMap.put("/swagger**/**", "anon"); - filterChainDefinitionMap.put("/webjars/**", "anon"); - filterChainDefinitionMap.put("/v3/**", "anon"); - - // update-begin--Author:sunjianlei Date:20210510 for:排除消息通告查看详情页面(用于第三方APP) - filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon"); - // update-end--Author:sunjianlei Date:20210510 for:排除消息通告查看详情页面(用于第三方APP) - - //积木报表排除 - filterChainDefinitionMap.put("/jmreport/**", "anon"); - filterChainDefinitionMap.put("/**/*.js.map", "anon"); - filterChainDefinitionMap.put("/**/*.css.map", "anon"); - - //积木BI大屏和仪表盘排除 - filterChainDefinitionMap.put("/drag/view", "anon"); - filterChainDefinitionMap.put("/drag/page/queryById", "anon"); - filterChainDefinitionMap.put("/drag/page/addVisitsNumber", "anon"); - filterChainDefinitionMap.put("/drag/page/queryTemplateList", "anon"); - filterChainDefinitionMap.put("/drag/share/view/**", "anon"); - filterChainDefinitionMap.put("/drag/onlDragDatasetHead/getAllChartData", "anon"); - filterChainDefinitionMap.put("/drag/onlDragDatasetHead/getTotalData", "anon"); - filterChainDefinitionMap.put("/drag/mock/json/**", "anon"); - filterChainDefinitionMap.put("/jimubi/view", "anon"); - filterChainDefinitionMap.put("/jimubi/share/view/**", "anon"); - - //大屏模板例子 - filterChainDefinitionMap.put("/test/bigScreen/**", "anon"); - filterChainDefinitionMap.put("/bigscreen/template1/**", "anon"); - filterChainDefinitionMap.put("/bigscreen/template2/**", "anon"); - //filterChainDefinitionMap.put("/test/jeecgDemo/rabbitMqClientTest/**", "anon"); //MQ测试 - //filterChainDefinitionMap.put("/test/jeecgDemo/html", "anon"); //模板页面 - //filterChainDefinitionMap.put("/test/jeecgDemo/redis/**", "anon"); //redis测试 - - //websocket排除 - filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告 - filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块 - filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例 - - //性能监控——安全隐患泄露TOEKN(durid连接池也有) - //filterChainDefinitionMap.put("/actuator/**", "anon"); - //测试模块排除 - filterChainDefinitionMap.put("/test/seata/**", "anon"); - - //错误路径排除 - filterChainDefinitionMap.put("/error", "anon"); - // 企业微信证书排除 - filterChainDefinitionMap.put("/WW_verify*", "anon"); - - filterChainDefinitionMap.put("/openapi/call/**", "anon"); - - // 添加自己的过滤器并且取名为jwt - Map filterMap = new HashMap(1); - //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】 - Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY); - filterMap.put("jwt", new JwtFilter(cloudServer==null)); - shiroFilterFactoryBean.setFilters(filterMap); - // - org.jeecgframework.boot + org.jeecgframework.boot3 jeecg-aiflow - 1.0.4 + 1.0.5 diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/controller/AiragAppController.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/controller/AiragAppController.java index 6a81852ff7ff627ae6a81f1bf5916348f00382aa..651872e2ab1c0bb0296a2533b35f2cbe3c7a8d65 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/controller/AiragAppController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/controller/AiragAppController.java @@ -18,7 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; /** diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java index c198b215fa38708d1680891d67c6ebfbc7458a0c..f7ee0cbeb6cb1125169ba644a478b738f7c71726 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java @@ -37,7 +37,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragKnowledgeController.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragKnowledgeController.java index 2abf2b365013d16ec7961716c24f19e084c79434..3e9f45205baeb96f07d6b90403487afd6f2299ac 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragKnowledgeController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragKnowledgeController.java @@ -19,7 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragModelController.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragModelController.java index e13841e0e73e48ad816e74bdb99502c38615113b..bb2d31a0a620b4d0ec209f484ef64a2a3918c971 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragModelController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragModelController.java @@ -14,8 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; /** diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java index 0256a916992a31981a4fc6d43ceb74a746600a31..6823e7913788c92531401949e621d82bd51cb7e3 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java @@ -24,7 +24,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/pom.xml b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/pom.xml index 03b04c62e3ab91b58c6af915743104a75a148ef2..57af6155fe3f79511a13f75e2f9f9f95a9018671 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/pom.xml +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-module org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java index 28a35ed0f1c4ec4431f06f8cc2028a85bf5683d8..a7a0bb8c63e44e9e8abbf45eb6f22bfc405bd079 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java @@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** * 服务端提供方——feign接口 diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java index 40513731b0f5ff2f65abc73974c2bffafcce8afa..b6b4ec467570887b3befcee9e37b212649f81da9 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java @@ -6,8 +6,8 @@ import org.apache.commons.io.IOUtils; import org.jeecg.common.api.vo.Result; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import javax.swing.filechooser.FileSystemView; import java.io.File; import java.io.IOException; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java index e51b057814d837e437ebf9c6254d2045ae438a51..a347aad821b6410a1ce566479db6a58788172ea1 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java @@ -18,7 +18,7 @@ import org.jeecg.modules.demo.mock.vxe.entity.MockEntity; import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.net.URLDecoder; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VxeSocket.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VxeSocket.java index 24d4eb31519499d1b3cb24e81d2217b4acdb5acc..017e8b66ebd851e2206457d5ba1c5e13b1289690 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VxeSocket.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VxeSocket.java @@ -6,12 +6,12 @@ import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.VxeSocketConst; import org.springframework.stereotype.Component; -import javax.websocket.OnClose; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.server.PathParam; -import javax.websocket.server.ServerEndpoint; +import jakarta.websocket.OnClose; +import jakarta.websocket.OnMessage; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; import java.util.Collection; import java.util.HashMap; import java.util.Map; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java index 113e6a489fa0c64f51f2c96cf714d950c92d1fde..af840c7311db77ec7fbec12d69bfd6652282a20c 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java @@ -12,8 +12,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.mgt.DefaultSecurityManager; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.aspect.annotation.PermissionData; @@ -31,8 +29,8 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import reactor.core.publisher.Mono; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -482,8 +480,8 @@ public class JeecgDemoController extends JeecgController test() { //解决shiro报错No SecurityManager accessible to the calling code, either bound to the org.apache.shiro // https://blog.csdn.net/Japhet_jiu/article/details/131177210 - DefaultSecurityManager securityManager = new DefaultSecurityManager(); - SecurityUtils.setSecurityManager(securityManager); +// DefaultSecurityManager securityManager = new DefaultSecurityManager(); +// SecurityUtils.setSecurityManager(securityManager); return Mono.just("测试"); } diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.java index b6a61ff9759aebb6610a3de5f4ff022ce004db7d..e1adfe8975b745014237165ae42827113f304019 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.java @@ -10,7 +10,10 @@ import org.jeecg.modules.demo.test.entity.JeecgDemo; import org.jeecg.modules.demo.test.service.IJeecgDemoService; import org.jeecg.modules.demo.test.service.IJeecgDynamicDataService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import java.util.List; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.java index 9b02a9a30b03d728b9a92193d5edccfd659b8729..f21e131a6d94d8fb6e82f245706209671a87336e 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.java @@ -17,7 +17,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; /** diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java index bfb9ea535837cd408b01b3ab1d2aef70a91c43f3..7b840af05482bb672b5726faa2240bd31721c3a8 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java @@ -5,15 +5,16 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import com.alibaba.fastjson.JSON; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.demo.test.entity.JeecgDemo; import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; import org.jeecg.modules.demo.test.entity.JeecgOrderMain; @@ -30,6 +31,7 @@ import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -184,7 +186,7 @@ public class JeecgOrderMainController extends JeecgController pageList = new ArrayList(); diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java index c375ebc9162667ff5769907e6f5c798d5334bbae..ecc2c17d3a96e3fd83ed28ea0ece07b9e3750934 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java @@ -7,8 +7,8 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java index dfb1443499b5ab47f7743dbb0fcaecd2e91d19e7..c7d0c85b35c84afdadcb55eb6e96b509d901d0ff 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java @@ -1,17 +1,19 @@ package org.jeecg.modules.demo.test.service.impl; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.demo.test.entity.JeecgDemo; import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper; import org.jeecg.modules.demo.test.service.IJeecgDemoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -97,7 +99,7 @@ public class JeecgDemoServiceImpl extends ServiceImpl noAuthList = new ArrayList<>(); diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java index e3f99a383926e5dd4c9cf63bbae65c9f8abc3632..409c71fa39baade8aea116dabcb02f810cb113ae 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/dlglong/controller/DlMockController.java @@ -18,7 +18,7 @@ import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket; import org.jeecg.modules.dlglong.entity.MockEntity; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.net.URLDecoder; diff --git a/jeecg-boot/jeecg-boot-module/pom.xml b/jeecg-boot/jeecg-boot-module/pom.xml index 436ff2e343d5800967938ef08dd068fb1fcb62cf..88063d175da42d3dee1b5d367d127d6efa748af2 100644 --- a/jeecg-boot/jeecg-boot-module/pom.xml +++ b/jeecg-boot/jeecg-boot-module/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-parent org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/pom.xml index 0c7f9a5f997b297d9b4342c31fbd3f7eb57af3db..b31b0ec1bc4be90940bbe4379a7e07abdb353d0c 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/pom.xml @@ -5,7 +5,7 @@ jeecg-system-api org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index d23a691264d67c87c92fdfcca0a364d189d3befd..94c6ec1dc7e5b01854a1d3768fc7f1ec26e748c7 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -792,4 +792,18 @@ public interface ISysBaseAPI extends CommonAPI { @RequestParam(value = "fields", required = false) String... fields ); + @GetMapping("/sys/api/getUserByPhone") + public LoginUser getUserByPhone(@RequestParam("phone") String phone); + + @GetMapping("/sys/api/queryAllDictItems") + Map> queryAllDictItems(); + + @GetMapping("/sys/api/queryUserDeparts") + List queryUserDeparts(@RequestParam("userId") String userId); + + @PostMapping("/sys/api/updateUserDepart") + void updateUserDepart(@RequestParam("username") String username,@RequestParam("orgCode") String orgCode,@RequestParam("loginTenantId") Integer loginTenantId); + + @GetMapping("/sys/api/setLoginTenant") + JSONObject setLoginTenant(@RequestParam("username") String username); } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java index 7b8a3d325a8c1da3acb77b972341e5326a3f1938..c7170eeed15053c2caa287b9e8ad0a9bd972e6b1 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java @@ -464,4 +464,28 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return false; } + @Override + public Map> queryAllDictItems() { + return null; + } + + @Override + public List queryUserDeparts(String userId) { + return null; + } + + @Override + public void updateUserDepart(String username, String orgCode, Integer loginTenantId) { + + } + + @Override + public LoginUser getUserByPhone(String phone) { + return null; + } + + @Override + public JSONObject setLoginTenant(String username) { + return null; + } } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java index c4f8a84b3d59420c94a335b42d60526f377ead26..906b6042201298eba0a71e0e6eb095e273abdbbf 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java @@ -6,7 +6,7 @@ //import java.util.List; //import java.util.SortedMap; // -//import javax.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletRequest; // //import org.jeecg.common.config.mqtoken.UserTokenContext; //import org.jeecg.common.constant.CommonConstant; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml index a5ba294e14599b047e209d96363006968e597d0f..142f8385bf486867b6b220575f4ac0a93210771f 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml @@ -5,7 +5,7 @@ jeecg-system-api org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-api/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-api/pom.xml index 0e182485d3d51bf078dcbef213d0e6432a0cc778..4d6a7cc16f5d30b7dcf714c04cef84b2428ae046 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-api/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-api/pom.xml @@ -5,7 +5,7 @@ jeecg-module-system org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml index 560f9c633d1cb50840eb7cfedb5116935ebb551f..a68169f544c9ea398da8e7018b30b43a6c5e3353 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml @@ -4,7 +4,7 @@ org.jeecgframework.boot jeecg-module-system - 3.8.0 + 3.8.1 4.0.0 @@ -20,7 +20,7 @@ hibernate-core - org.jeecgframework.boot + org.jeecgframework.boot3 hibernate-re @@ -32,7 +32,13 @@ org.jeecgframework.jimureport - jimureport-spring-boot-starter + jimureport-spring-boot3-starter-fastjson2 + + + com.github.jsqlparser + jsqlparser + + org.jeecgframework.jimureport @@ -41,7 +47,19 @@ org.jeecgframework.jimureport - jimubi-spring-boot-starter + jimubi-spring-boot3-starter + + + com.github.jsqlparser + jsqlparser + + + + + + org.jeecgframework.boot + jeecg-boot-module-airag + ${jeecgboot.version} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java index ef0086ed929d10f3f678a6c2777a6c0ab0a06100..3fe54d1adf2933b9ccb0571602204c92e7512985 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java @@ -12,7 +12,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -36,11 +36,7 @@ public class JimuReportTokenService implements JmReportTokenServiceI { @Override public String getToken(HttpServletRequest request) { - try { - return TokenUtils.getTokenByRequest(request); - } catch (Exception e) { - return null; - } + return TokenUtils.getTokenByRequest(request); } @Override diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/aop/TenantPackUserLogAspect.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/aop/TenantPackUserLogAspect.java index 13c03c67894a78d33b8c9609ebe5bef31ea75595..1f042e26bd83e29ffdba9c7a79427aba840c669c 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/aop/TenantPackUserLogAspect.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/aop/TenantPackUserLogAspect.java @@ -1,6 +1,6 @@ package org.jeecg.modules.aop; -import org.apache.shiro.SecurityUtils; +import com.alibaba.fastjson.JSON; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; @@ -10,12 +10,14 @@ import org.aspectj.lang.reflect.MethodSignature; import org.jeecg.common.api.dto.LogDTO; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.SysTenantPack; import org.jeecg.modules.system.entity.SysTenantPackUser; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.lang.reflect.Method; import java.util.Date; @@ -79,7 +81,7 @@ public class TenantPackUserLogAspect { dto.setOperateType(opType); dto.setTenantId(tenantId); //获取登录用户信息 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); if(sysUser!=null){ dto.setUserid(sysUser.getUsername()); dto.setUsername(sysUser.getRealname()); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java index 4fffe7c1d0d8af4854ea1504b60026db5091da11..c7c1d47e1f8c1fb6b27b24b3f5fb317527fcd910 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java @@ -977,4 +977,29 @@ public class SystemApiController { return sysBaseApi.dictTableWhiteListCheckByDict(tableOrDictCode, fields); } + @GetMapping("/sys/api/getUserByPhone") + public LoginUser getUserByPhone(String phone) { + return sysBaseApi.getUserByPhone(phone); + } + + @GetMapping("/sys/api/queryAllDictItems") + public Map> queryAllDictItems() { + return sysBaseApi.queryAllDictItems(); + } + + @GetMapping("/sys/api/queryUserDeparts") + public List queryUserDeparts(@RequestParam("userId") String userId) { + return sysBaseApi.queryUserDeparts(userId); + } + + @PostMapping("/sys/api/updateUserDepart") + public void updateUserDepart(@RequestParam("username") String username,@RequestParam("orgCode") String orgCode,@RequestParam("loginTenantId") Integer loginTenantId) { + sysBaseApi.updateUserDepart(username, orgCode, loginTenantId); + } + + @GetMapping("/sys/api/setLoginTenant") + public JSONObject setLoginTenant(@RequestParam("username") String username) { + return sysBaseApi.setLoginTenant(username); + } + } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java index 84209572e99f2225502196e11e6092905d3f6c4b..034b47e9479d36d725e866273da5c31b5f86fe63 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java @@ -2,8 +2,8 @@ package org.jeecg.modules.cas.controller; import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.vo.Result; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java index 393ac8a91f9fb64b392c9414ca1df6c2e91b5d63..87d53a4e04d04414479020589c60e72c91623b54 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java @@ -2,8 +2,8 @@ package org.jeecg.modules.message.controller; import java.util.Arrays; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.base.controller.JeecgController; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java index 79c448d15098b26506805fce6d111005dd1df812..8cba0ba41369826f86ce97151ada365de4d9b53f 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java @@ -3,8 +3,8 @@ package org.jeecg.modules.message.controller; import java.util.Arrays; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.api.vo.Result; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java index 461705a63c7d76fa994929681ca1ffef1e89aba3..71ecf22ce0d6c9be80a5473516bf96861870a08f 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java @@ -21,8 +21,8 @@ import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Component; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java index 7a04d4417a338f65db6b6f81d1f9361c50cd80b8..8eeae558a6d0977e880d9ede053b1380c6e71c6f 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java @@ -19,7 +19,7 @@ import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper; import org.jeecg.modules.system.mapper.SysUserMapper; import org.springframework.stereotype.Component; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.Date; import java.util.Map; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java index 84d64e6c94a48ea8cd1270a32ff253f1a46f8201..a6cc51d653301527ac79204634cf251dfcd897d8 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java @@ -2,9 +2,9 @@ package org.jeecg.modules.message.websocket; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import javax.websocket.*; -import javax.websocket.server.PathParam; -import javax.websocket.server.ServerEndpoint; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; import com.alibaba.fastjson.JSONObject; import org.jeecg.common.base.BaseMap; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/CustomActuatorConfig.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/CustomActuatorConfig.java index c051a594918737790f7e9056d518339d3ce7cc82..a7c85b09ff7d916b66f2ec4aef4570aa9a3e8432 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/CustomActuatorConfig.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/CustomActuatorConfig.java @@ -1,9 +1,9 @@ package org.jeecg.modules.monitor.actuator; import org.jeecg.modules.monitor.actuator.httptrace.CustomInMemoryHttpTraceRepository; -import org.springframework.boot.actuate.autoconfigure.trace.http.HttpTraceAutoConfiguration; -import org.springframework.boot.actuate.autoconfigure.trace.http.HttpTraceProperties; -import org.springframework.boot.actuate.trace.http.HttpTraceRepository; +import org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesProperties; +import org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -18,8 +18,8 @@ import org.springframework.context.annotation.Configuration; * @Date: 2024/5/13 17:20 */ @Configuration -@EnableConfigurationProperties(HttpTraceProperties.class) -@AutoConfigureBefore(HttpTraceAutoConfiguration.class) +@EnableConfigurationProperties(HttpExchangesProperties.class) +@AutoConfigureBefore(HttpExchangesAutoConfiguration.class) public class CustomActuatorConfig { /** @@ -30,7 +30,7 @@ public class CustomActuatorConfig { */ @Bean @ConditionalOnProperty(prefix = "management.trace.http", name = "enabled", matchIfMissing = true) - @ConditionalOnMissingBean(HttpTraceRepository.class) + @ConditionalOnMissingBean(HttpExchangeRepository.class) public CustomInMemoryHttpTraceRepository traceRepository() { return new CustomInMemoryHttpTraceRepository(); } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomHttpTraceEndpoint.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomHttpTraceEndpoint.java index 7811e07ada8168d584b95320454315b91b41e5f8..71aebfcc03e405ca3eeaf9a08a63650af3b85586 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomHttpTraceEndpoint.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomHttpTraceEndpoint.java @@ -4,7 +4,7 @@ import lombok.Getter; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.annotation.Selector; -import org.springframework.boot.actuate.trace.http.HttpTrace; +import org.springframework.boot.actuate.web.exchanges.HttpExchange; import org.springframework.stereotype.Component; import org.springframework.util.Assert; @@ -29,14 +29,14 @@ public class CustomHttpTraceEndpoint{ @ReadOperation public HttpTraceDescriptor traces(@Selector(match = ALL_REMAINING) String query) { - return new CustomHttpTraceEndpoint.HttpTraceDescriptor(this.repository.findAll(query)); + return new HttpTraceDescriptor(this.repository.findAll(query)); } @Getter public static final class HttpTraceDescriptor { - private final List traces; + private final List traces; - private HttpTraceDescriptor(List traces) { + private HttpTraceDescriptor(List traces) { this.traces = traces; } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomInMemoryHttpTraceRepository.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomInMemoryHttpTraceRepository.java index 16fec3040c5b76333d0215ea019538100591458d..2c52cb5d4d291049598eb72a7af12b6d8a7b54f0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomInMemoryHttpTraceRepository.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomInMemoryHttpTraceRepository.java @@ -1,7 +1,7 @@ package org.jeecg.modules.monitor.actuator.httptrace; -import org.springframework.boot.actuate.trace.http.HttpTrace; -import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository; +import org.springframework.boot.actuate.web.exchanges.HttpExchange; +import org.springframework.boot.actuate.web.exchanges.InMemoryHttpExchangeRepository; import java.util.List; import java.util.stream.Collectors; @@ -12,17 +12,17 @@ import java.util.stream.Stream; * @Author: chenrui * @Date: 2024/5/13 17:02 */ -public class CustomInMemoryHttpTraceRepository extends InMemoryHttpTraceRepository { +public class CustomInMemoryHttpTraceRepository extends InMemoryHttpExchangeRepository { @Override - public List findAll() { + public List findAll() { return super.findAll(); } - public List findAll(String query) { - List allTrace = super.findAll(); + public List findAll(String query) { + List allTrace = super.findAll(); if (null != allTrace && !allTrace.isEmpty()) { - Stream stream = allTrace.stream(); + Stream stream = allTrace.stream(); String[] params = query.split(","); stream = filter(params, stream); stream = sort(params, stream); @@ -31,7 +31,7 @@ public class CustomInMemoryHttpTraceRepository extends InMemoryHttpTraceReposito return allTrace; } - private Stream sort(String[] params, Stream stream) { + private Stream sort(String[] params, Stream stream) { if (params.length < 2) { return stream; } @@ -56,7 +56,7 @@ public class CustomInMemoryHttpTraceRepository extends InMemoryHttpTraceReposito }); } - private static Stream filter(String[] params, Stream stream) { + private static Stream filter(String[] params, Stream stream) { if (params.length == 0) { return stream; } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java index a8735b6a74bbb3333d62b573cbf1e68cbba590ed..89d90dc04ec10b0a5fd7949a203d8bad8e9414fe 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java @@ -10,8 +10,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import javax.swing.filechooser.FileSystemView; import java.io.File; import java.util.ArrayList; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java index 0a6e63bf46238e4880f430f16cf81935da882af7..bdeaa24e04f843d46a028ab7bd0e7f4ccb7539b1 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java @@ -2,7 +2,7 @@ package org.jeecg.modules.monitor.service.impl; import java.util.*; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java index c62531801590d3f33ce167899c91fbfeef6f270c..0aefd9f73219963403a00ec89250f837c861a87d 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java @@ -1,6 +1,6 @@ //package org.jeecg.modules.ngalain.aop; // -//import javax.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletRequest; // //import org.aspectj.lang.ProceedingJoinPoint; //import org.aspectj.lang.annotation.Around; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java index 1930b97ee9f471878ca0207311648decc763104d..a73118224d9559bd1509e6b6135c3bc17880125d 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java @@ -4,7 +4,7 @@ //import java.util.List; //import java.util.Map; // -//import javax.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletRequest; // //import org.apache.shiro.SecurityUtils; //import org.jeecg.common.api.vo.Result; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiAuthController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiAuthController.java index 66cf6a4e9f5e18ae815bc2e795d74f2f7b10b5aa..fec2ec75565f6ae276553247df0e85b2bc727e01 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiAuthController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiAuthController.java @@ -11,7 +11,7 @@ import org.jeecg.modules.openapi.generator.AKSKGenerator; import org.jeecg.modules.openapi.service.OpenApiAuthService; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiController.java index 84d9da2db0474db65228f0dbbed5f98d28693ea3..22e2f41bccd305d137195dcd9dc87cf97a021b99 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiController.java @@ -33,7 +33,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.net.URI; import java.util.*; import java.util.stream.Collectors; @@ -196,7 +196,7 @@ public class OpenApiController extends JeecgController } } URI targetUrl = builder.build().encode().toUri(); - return restTemplate.exchange(targetUrl.toString(), Objects.requireNonNull(HttpMethod.resolve(method)), httpEntity, Result.class, request.getParameterMap()).getBody(); + return restTemplate.exchange(targetUrl.toString(), Objects.requireNonNull(HttpMethod.valueOf(method)), httpEntity, Result.class, request.getParameterMap()).getBody(); } /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiLogController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiLogController.java index 8fb495532a116ff3e81a93eaa2f6c2a7c6892b10..6ca5e03155411ea7449b2ad066b9be36f1cb1fc8 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiLogController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiLogController.java @@ -10,7 +10,7 @@ import org.jeecg.modules.openapi.entity.OpenApiLog; import org.jeecg.modules.openapi.service.OpenApiLogService; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApi.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApi.java index 5913ccfad8c6a565623f18ea7daecb0c7953907b..92c62386a980ef9be0d9bdac715902dc148d7095 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApi.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApi.java @@ -1,7 +1,6 @@ package org.jeecg.modules.openapi.entity; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import lombok.Data; @@ -10,7 +9,6 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; -import java.util.List; /** * 接口表 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiHeader.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiHeader.java index de4067bc2c57f3c9a7f6725dd47d1957b00f3530..48ec9a05f6fd1a4be7f52c74a33db32dd26b1ad3 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiHeader.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiHeader.java @@ -1,7 +1,5 @@ package org.jeecg.modules.openapi.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiParam.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiParam.java index 202a07a1364ce79f3b197b806c6a374625626bdc..cd042b4df75da0783a24df6175b33f06274bcb73 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiParam.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiParam.java @@ -1,7 +1,5 @@ package org.jeecg.modules.openapi.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiAuthFilter.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiAuthFilter.java index 6755843ae6369f45922d176ea4eddb31fb1421fa..a301d13b6c7f1b9e4f3ad69a0860a3c17b1553ef 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiAuthFilter.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiAuthFilter.java @@ -1,5 +1,7 @@ package org.jeecg.modules.openapi.filter; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.modules.openapi.entity.OpenApi; @@ -13,8 +15,6 @@ import org.jeecg.modules.openapi.service.OpenApiService; import org.springframework.util.StringUtils; import org.springframework.web.context.WebApplicationContext; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.security.MessageDigest; import java.util.Arrays; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiPermissionServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiPermissionServiceImpl.java index f18cba34cf9399e0be396c32bd0098e2650f4d17..34dcce092b4ad0372d9d8f40fad7284236ff650b 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiPermissionServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiPermissionServiceImpl.java @@ -7,7 +7,6 @@ import org.jeecg.modules.openapi.mapper.OpenApiPermissionMapper; import org.jeecg.modules.openapi.service.OpenApiPermissionService; import org.springframework.stereotype.Service; -import java.util.Collections; import java.util.List; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerOperationParameter.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerOperationParameter.java index 4ce9015a43bb2977af7244d72bce86e197091f23..dac52a978b76cf70583df73c4c1126f54d2ea906 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerOperationParameter.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerOperationParameter.java @@ -2,7 +2,6 @@ package org.jeecg.modules.openapi.swagger; import lombok.Data; -import java.util.List; import java.util.Map; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/controller/OssFileController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/controller/OssFileController.java index 8cb3d96f27912a706de1bea5c170a8ed6564c581..eaefea37c8d029fca0fc2d69074df1f8cc9a65ed 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/controller/OssFileController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/controller/OssFileController.java @@ -1,14 +1,13 @@ package org.jeecg.modules.oss.controller; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.modules.oss.entity.OssFile; import org.jeecg.modules.oss.service.IOssFileService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -48,7 +47,7 @@ public class OssFileController { @ResponseBody @PostMapping("/upload") //@RequiresRoles("admin") - @RequiresPermissions("system:ossFile:upload") + @PreAuthorize("@jps.requiresPermissions('system:ossFile:upload')") public Result upload(@RequestParam("file") MultipartFile multipartFile) { Result result = new Result(); try { diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java index 741f5ab4e089fb943abb55b38dfc19c45d3564ea..1042022eff8b652cee31e531e8ceb8fdc0ddd9c5 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java @@ -1,14 +1,12 @@ package org.jeecg.modules.quartz.controller; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; @@ -16,6 +14,7 @@ import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.ImportExcelUtil; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.quartz.entity.QuartzJob; import org.jeecg.modules.quartz.service.IQuartzJobService; import org.jeecgframework.poi.excel.ExcelImportUtil; @@ -26,13 +25,15 @@ import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -81,7 +82,7 @@ public class QuartzJobController { * @return */ //@RequiresRoles("admin") - @RequiresPermissions("system:quartzJob:add") + @PreAuthorize("@jps.requiresPermissions('system:quartzJob:add')") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody QuartzJob quartzJob) { quartzJobService.saveAndScheduleJob(quartzJob); @@ -95,7 +96,7 @@ public class QuartzJobController { * @return */ //@RequiresRoles("admin") - @RequiresPermissions("system:quartzJob:edit") + @PreAuthorize("@jps.requiresPermissions('system:quartzJob:edit')") @RequestMapping(value = "/edit", method ={RequestMethod.PUT, RequestMethod.POST}) public Result eidt(@RequestBody QuartzJob quartzJob) { try { @@ -114,7 +115,7 @@ public class QuartzJobController { * @return */ //@RequiresRoles("admin") - @RequiresPermissions("system:quartzJob:delete") + @PreAuthorize("@jps.requiresPermissions('system:quartzJob:delete')") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) public Result delete(@RequestParam(name = "id", required = true) String id) { QuartzJob quartzJob = quartzJobService.getById(id); @@ -133,7 +134,7 @@ public class QuartzJobController { * @return */ //@RequiresRoles("admin") - @RequiresPermissions("system:quartzJob:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:quartzJob:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { if (ids == null || "".equals(ids.trim())) { @@ -153,7 +154,7 @@ public class QuartzJobController { * @return */ //@RequiresRoles("admin") - @RequiresPermissions("system:quartzJob:pause") + @PreAuthorize("@jps.requiresPermissions('system:quartzJob:pause')") @GetMapping(value = "/pause") @Operation(summary = "停止定时任务") public Result pauseJob(@RequestParam(name = "id") String id) { @@ -172,7 +173,7 @@ public class QuartzJobController { * @return */ //@RequiresRoles("admin") - @RequiresPermissions("system:quartzJob:resume") + @PreAuthorize("@jps.requiresPermissions('system:quartzJob:resume')") @GetMapping(value = "/resume") @Operation(summary = "启动定时任务") public Result resumeJob(@RequestParam(name = "id") String id) { @@ -221,7 +222,7 @@ public class QuartzJobController { mv.addObject(NormalExcelConstants.CLASS, QuartzJob.class); //获取当前登录用户 //update-begin---author:wangshuai ---date:20211227 for:[JTC-116]导出人写死了------------ - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("定时任务列表数据", "导出人:"+user.getRealname(), "导出信息")); //update-end---author:wangshuai ---date:20211227 for:[JTC-116]导出人写死了------------ mv.addObject(NormalExcelConstants.DATA_LIST, pageList); @@ -279,7 +280,7 @@ public class QuartzJobController { * @return */ //@RequiresRoles("admin") - @RequiresPermissions("system:quartzJob:execute") + @PreAuthorize("@jps.requiresPermissions('system:quartzJob:execute')") @GetMapping("/execute") public Result execute(@RequestParam(name = "id", required = true) String id) { QuartzJob quartzJob = quartzJobService.getById(id); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java index 7766792a11d76005e8a154a21322b8d26145af89..caab1c6422226d41b81a63cae89b0105f1a8702b 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java @@ -1,12 +1,12 @@ package org.jeecg.modules.system.cache; +import jakarta.annotation.PostConstruct; import me.zhyd.oauth.cache.AuthCacheConfig; import me.zhyd.oauth.cache.AuthStateCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; -import javax.annotation.PostConstruct; import java.util.concurrent.TimeUnit; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/CommonController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/CommonController.java index c4abb88464a12c34b3c7d71d83120131a4e97745..2b7598bf54a2853d5d9813eadc99068540e60976 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/CommonController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/CommonController.java @@ -19,8 +19,8 @@ import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.*; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java index 84bc35b23349863f1e953e7286b797074e2ccd41..ce21fe71b5b6f1528d0b52bafb1567775887ef29 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * @Title: DuplicateCheckAction diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java index 6085346eaaecaa968eb75a03fa29a53b3e5783bf..ec5b5f614e3909a84acb768bb1d1ca60a9b444c6 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -1,6 +1,8 @@ package org.jeecg.modules.system.controller; import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.exceptions.ClientException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -9,7 +11,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; @@ -20,10 +21,10 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.*; import org.jeecg.common.util.encryption.EncryptedString; import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysRoleIndex; -import org.jeecg.modules.system.entity.SysTenant; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.model.SysLoginModel; import org.jeecg.modules.system.service.*; @@ -31,14 +32,23 @@ import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.jeecg.modules.system.util.RandImageUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.CacheManager; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.authentication.event.LogoutSuccessEvent; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.*; -import java.util.stream.Collectors; /** * @Author scott @@ -67,9 +77,18 @@ public class LoginController { private BaseCommonService baseCommonService; @Autowired private JeecgBaseConfig jeecgBaseConfig; + @Autowired + private OAuth2AuthorizationService authorizationService; + @Autowired + private CacheManager cacheManager; private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890"; + /** + * 使用spring authorization server提供的各类登录接口 + * @param sysLoginModel + * @return + */ @Operation(summary = "登录接口") @RequestMapping(value = "/login", method = RequestMethod.POST) public Result login(@RequestBody SysLoginModel sysLoginModel, HttpServletRequest request){ @@ -166,8 +185,6 @@ public class LoginController { obj.put("userInfo",sysUser); obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); - log.info("3 获取用户信息耗时 (字典数据)" + (System.currentTimeMillis() - start) + "毫秒"); - result.setResult(obj); result.success(""); } @@ -203,7 +220,15 @@ public class LoginController { //清空用户的缓存信息(包括部门信息),例如sys:cache:user:: redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername())); //调用shiro的logout - SecurityUtils.getSubject().logout(); +// SecurityUtils.getSubject().logout(); + + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + + // 清空用户信息 + cacheManager.getCache("user_details").evict(authorization.getPrincipalName()); + // 清空access token + authorizationService.remove(authorization); + return Result.ok("退出登录成功!"); }else { return Result.error("Token无效!"); @@ -273,7 +298,7 @@ public class LoginController { Result result = new Result(); String username = user.getUsername(); if(oConvertUtils.isEmpty(username)) { - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); username = sysUser.getUsername(); } @@ -558,7 +583,7 @@ public class LoginController { /** * 切换菜单表为vue3的表 */ - @RequiresRoles({"admin"}) + @PreAuthorize("@jps.requiresRoles('admin')") @GetMapping(value = "/switchVue3Menu") public Result switchVue3Menu(HttpServletResponse response) { Result res = new Result(); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java index aa07a9ff06e6248257a9d38409ca8acbe1d0174a..03d2d5901d9a9de761e74a3b510bae586a99d420 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java @@ -1,5 +1,7 @@ package org.jeecg.modules.system.controller; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +21,7 @@ import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.*; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.message.enums.RangeDateEnum; import org.jeecg.modules.message.websocket.WebSocket; import org.jeecg.modules.system.entity.SysAnnouncement; @@ -38,20 +41,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -338,7 +339,7 @@ public class SysAnnouncementController { long start = System.currentTimeMillis(); Result> result = new Result>(); Map sysMsgMap = new HashMap(5); - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String userId = sysUser.getId(); @@ -410,7 +411,7 @@ public class SysAnnouncementController { //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "系统通告列表"); mv.addObject(NormalExcelConstants.CLASS, SysAnnouncement.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("系统通告列表数据", "导出人:"+user.getRealname(), "导出信息")); mv.addObject(NormalExcelConstants.DATA_LIST, pageList); return mv; @@ -578,7 +579,7 @@ public class SysAnnouncementController { JSONObject obj = new JSONObject(); obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); webSocket.sendMessage(sysUser.getId(), obj.toJSONString()); // 4、性能统计耗时 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementSendController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementSendController.java index 4897c79e63e1218b76c6d9f2d8d0c7956cdab05f..9580a12be37381681c4ef820ed2b9a8fef3b1a73 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementSendController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementSendController.java @@ -3,10 +3,10 @@ package org.jeecg.modules.system.controller; import java.util.Arrays; import java.util.Date; -import javax.servlet.http.HttpServletRequest; +import com.alibaba.fastjson.JSON; +import jakarta.servlet.http.HttpServletRequest; -import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.SecurityUtils; +import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; @@ -14,11 +14,13 @@ import org.jeecg.common.constant.WebsocketConst; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.SqlInjectionUtil; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.message.websocket.WebSocket; import org.jeecg.modules.system.entity.SysAnnouncementSend; import org.jeecg.modules.system.model.AnnouncementSendModel; import org.jeecg.modules.system.service.ISysAnnouncementSendService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -195,7 +197,7 @@ public class SysAnnouncementSendController { public Result editById(@RequestBody JSONObject json) { Result result = new Result(); String anntId = json.getString("anntId"); - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String userId = sysUser.getId(); LambdaUpdateWrapper updateWrapper = new UpdateWrapper().lambda(); updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG); @@ -220,7 +222,7 @@ public class SysAnnouncementSendController { @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) { Result> result = new Result>(); - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String userId = sysUser.getId(); announcementSendModel.setUserId(userId); announcementSendModel.setPageNo((pageNo-1)*pageSize); @@ -247,7 +249,7 @@ public class SysAnnouncementSendController { @PutMapping(value = "/readAll") public Result readAll() { Result result = new Result(); - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String userId = sysUser.getId(); LambdaUpdateWrapper updateWrapper = new UpdateWrapper().lambda(); updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java index 6a73007f8193a6f0884992ce74276ce51d081b44..6a87c6b93f18deabce86e1c2d509498f259a2c91 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; @@ -18,6 +17,7 @@ import org.jeecg.common.util.ImportExcelUtil; import org.jeecg.common.util.ReflectHelper; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.SysCategory; import org.jeecg.modules.system.model.TreeSelectModel; import org.jeecg.modules.system.service.ISysCategoryService; @@ -27,13 +27,14 @@ import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -237,7 +238,7 @@ public class SysCategoryController { //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "分类字典列表"); mv.addObject(NormalExcelConstants.CLASS, SysCategory.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("分类字典列表数据", "导出人:"+user.getRealname(), "导出信息")); return mv; } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCheckRuleController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCheckRuleController.java index 2f1156e984029e6802531657fedbee96e37f3c25..5574f035ea5ad4e991f6a659768ff275e79a9265 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCheckRuleController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCheckRuleController.java @@ -17,8 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Arrays; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCommentController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCommentController.java index e08e6259ebc41015896f5f1765f8bdbfec41ddae..1076fbc9db59a02059f1ea46b80d2c951956d0df 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCommentController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCommentController.java @@ -1,12 +1,12 @@ package org.jeecg.modules.system.controller; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.dto.DataLogDTO; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; @@ -14,17 +14,19 @@ import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.SysComment; import org.jeecg.modules.system.service.ISysCommentService; import org.jeecg.modules.system.vo.SysCommentFileVo; import org.jeecg.modules.system.vo.SysCommentVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; @@ -126,7 +128,7 @@ public class SysCommentController extends JeecgController queryPageList( SysDataSource sysDataSource, @@ -132,7 +130,7 @@ public class SysDataSourceController extends JeecgController edit(@RequestBody SysDataSource sysDataSource) { //update-begin-author:taoyan date:2022-8-10 for: jdbc连接地址漏洞问题 @@ -166,7 +164,7 @@ public class SysDataSourceController extends JeecgController deleteBatch(@RequestParam(name = "ids") String ids) { List idList = Arrays.asList(ids.split(",")); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java index 5e1b1232f5bd2d6c5df838052b8b89dee932b9fd..6ec12c7b9914be23c4ded6157c694ae5b8161db0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -1,12 +1,11 @@ package org.jeecg.modules.system.controller; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CacheConstant; @@ -19,6 +18,7 @@ import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.YouBianCodeUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.model.DepartIdModel; @@ -36,13 +36,15 @@ import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; @@ -76,7 +78,7 @@ public class SysDepartController { @RequestMapping(value = "/queryMyDeptTreeList", method = RequestMethod.GET) public Result> queryMyDeptTreeList() { Result> result = new Result<>(); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); try { if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){ //update-begin--Author:liusq Date:20210624 for:部门查询ids为空后的前端显示问题 issues/I3UD06 @@ -180,7 +182,7 @@ public class SysDepartController { * @param sysDepart * @return */ - @RequiresPermissions("system:depart:add") + @PreAuthorize("@jps.requiresPermissions('system:depart:add')") @RequestMapping(value = "/add", method = RequestMethod.POST) @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) public Result add(@RequestBody SysDepart sysDepart, HttpServletRequest request) { @@ -206,7 +208,7 @@ public class SysDepartController { * @param sysDepart * @return */ - @RequiresPermissions("system:depart:edit") + @PreAuthorize("@jps.requiresPermissions('system:depart:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) public Result edit(@RequestBody SysDepart sysDepart, HttpServletRequest request) { @@ -234,7 +236,7 @@ public class SysDepartController { * @param id * @return */ - @RequiresPermissions("system:depart:delete") + @PreAuthorize("@jps.requiresPermissions('system:depart:delete')") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) public Result delete(@RequestParam(name="id",required=true) String id) { @@ -260,7 +262,7 @@ public class SysDepartController { * @param ids * @return */ - @RequiresPermissions("system:depart:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:depart:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { @@ -324,7 +326,7 @@ public class SysDepartController { public Result> searchBy(@RequestParam(name = "keyWord", required = true) String keyWord,@RequestParam(name = "myDeptSearch", required = false) String myDeptSearch) { Result> result = new Result>(); //部门查询,myDeptSearch为1时为我的部门查询,登录用户为上级时查只查负责部门下数据 - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); String departIds = null; if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){ departIds = user.getDepartIds(); @@ -381,7 +383,7 @@ public class SysDepartController { //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表"); mv.addObject(NormalExcelConstants.CLASS, SysDepartExportVo.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("导入规则:\n" + "1、标题为第三行,部门路径和部门名称的标题不允许修改,否则会匹配失败;第四行为数据填写范围;\n" + "2、部门路径用英文字符/分割,部门名称为部门路径的最后一位;\n" + @@ -402,7 +404,7 @@ public class SysDepartController { * @param response * @return */ - @RequiresPermissions("system:depart:importExcel") + @PreAuthorize("@jps.requiresPermissions('system:depart:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { @@ -638,7 +640,7 @@ public class SysDepartController { //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表"); mv.addObject(NormalExcelConstants.CLASS, ExportDepartVo.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("部门列表数据", "导出人:"+user.getRealname(), "导出信息")); mv.addObject(NormalExcelConstants.DATA_LIST, pageList); return mv; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java index 3fad7e34c0561134602998185ed0ae32871a0608..2d9d0023f0b7b6b4d5a4da0b33b0299d0876d33b 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java @@ -1,22 +1,22 @@ package org.jeecg.modules.system.controller; -import java.util.*; -import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import org.apache.shiro.SecurityUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; -import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.SysDepartPermission; import org.jeecg.modules.system.entity.SysDepartRolePermission; @@ -24,19 +24,17 @@ import org.jeecg.modules.system.entity.SysPermission; import org.jeecg.modules.system.entity.SysPermissionDataRule; import org.jeecg.modules.system.model.TreeModel; import org.jeecg.modules.system.service.ISysDepartPermissionService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.modules.system.service.ISysDepartRolePermissionService; import org.jeecg.modules.system.service.ISysPermissionDataRuleService; import org.jeecg.modules.system.service.ISysPermissionService; - import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; +import java.util.*; +import java.util.stream.Collectors; + /** * @Description: 部门权限表 * @Author: jeecg-boot @@ -72,7 +70,7 @@ public class SysDepartPermissionController extends JeecgController queryPageList(SysDepartPermission sysDepartPermission, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @@ -90,7 +88,7 @@ public class SysDepartPermissionController extends JeecgController add(@RequestBody SysDepartPermission sysDepartPermission) { sysDepartPermissionService.save(sysDepartPermission); @@ -103,7 +101,7 @@ public class SysDepartPermissionController extends JeecgController edit(@RequestBody SysDepartPermission sysDepartPermission) { sysDepartPermissionService.updateById(sysDepartPermission); @@ -116,7 +114,7 @@ public class SysDepartPermissionController extends JeecgController delete(@RequestParam(name="id",required=true) String id) { sysDepartPermissionService.removeById(id); @@ -129,7 +127,7 @@ public class SysDepartPermissionController extends JeecgController deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.sysDepartPermissionService.removeByIds(Arrays.asList(ids.split(","))); @@ -142,7 +140,7 @@ public class SysDepartPermissionController extends JeecgController queryById(@RequestParam(name="id",required=true) String id) { SysDepartPermission sysDepartPermission = sysDepartPermissionService.getById(id); @@ -261,7 +259,7 @@ public class SysDepartPermissionController extends JeecgController queryPageList(SysDepartRole sysDepartRole, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @@ -110,8 +111,8 @@ public class SysDepartRoleController extends JeecgController add(@RequestBody SysDepartRole sysDepartRole) { sysDepartRoleService.save(sysDepartRole); @@ -124,8 +125,8 @@ public class SysDepartRoleController extends JeecgController edit(@RequestBody SysDepartRole sysDepartRole) { sysDepartRoleService.updateById(sysDepartRole); @@ -139,8 +140,8 @@ public class SysDepartRoleController extends JeecgController delete(@RequestParam(name="id",required=true) String id) { sysDepartRoleService.removeById(id); @@ -154,8 +155,8 @@ public class SysDepartRoleController extends JeecgController deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.sysDepartRoleService.deleteDepartRole(Arrays.asList(ids.split(","))); @@ -169,7 +170,7 @@ public class SysDepartRoleController extends JeecgController queryById(@RequestParam(name="id",required=true) String id) { SysDepartRole sysDepartRole = sysDepartRoleService.getById(id); @@ -196,7 +197,7 @@ public class SysDepartRoleController extends JeecgController deptRoleAdd(@RequestBody JSONObject json) { String newRoleId = json.getString("newRoleId"); @@ -204,7 +205,7 @@ public class SysDepartRoleController extends JeecgController> queryPageList( SysDict sysDict, @@ -389,7 +389,7 @@ public class SysDictController { * @param sysDict * @return */ - @RequiresPermissions("system:dict:add") + @PreAuthorize("@jps.requiresPermissions('system:dict:add')") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody SysDict sysDict) { Result result = new Result(); @@ -410,7 +410,7 @@ public class SysDictController { * @param sysDict * @return */ - @RequiresPermissions("system:dict:edit") + @PreAuthorize("@jps.requiresPermissions('system:dict:edit')") @RequestMapping(value = "/edit", method = { RequestMethod.PUT,RequestMethod.POST }) public Result edit(@RequestBody SysDict sysDict) { Result result = new Result(); @@ -432,7 +432,7 @@ public class SysDictController { * @param id * @return */ - @RequiresPermissions("system:dict:delete") + @PreAuthorize("@jps.requiresPermissions('system:dict:delete')") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) @CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) public Result delete(@RequestParam(name="id",required=true) String id) { @@ -451,7 +451,7 @@ public class SysDictController { * @param ids * @return */ - @RequiresPermissions("system:dict:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:dict:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) @CacheEvict(value= {CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { @@ -502,11 +502,8 @@ public class SysDictController { //update-end-author:liusq date:20230404 for: [issue/4358]springCache中的清除缓存的操作使用了“keys” //update-begin---author:scott ---date:2024-06-18 for:【TV360X-1320】分配权限必须退出重新登录才生效,造成很多用户困扰--- - // 清除当前用户的授权缓存信息 - Subject currentUser = SecurityUtils.getSubject(); - if (currentUser.isAuthenticated()) { - shiroRealm.clearCache(currentUser.getPrincipals()); - } + // 清除权限缓存 + jeecgPermissionService.clearCache(); //update-end---author:scott ---date::2024-06-18 for:【TV360X-1320】分配权限必须退出重新登录才生效,造成很多用户困扰--- return result; } @@ -550,7 +547,7 @@ public class SysDictController { // 注解对象Class mv.addObject(NormalExcelConstants.CLASS, SysDictPage.class); // 自定义表格参数 - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("数据字典列表", "导出人:"+user.getRealname(), "数据字典")); // 导出数据列表 mv.addObject(NormalExcelConstants.DATA_LIST, pageList); @@ -564,7 +561,7 @@ public class SysDictController { * @param * @return */ - @RequiresPermissions("system:dict:importExcel") + @PreAuthorize("@jps.requiresPermissions('system:dict:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; @@ -703,7 +700,7 @@ public class SysDictController { * @param ids 被删除的字典ID,多个id用半角逗号分割 * @return */ - @RequiresPermissions("system:dict:deleteRecycleBin") + @PreAuthorize("@jps.requiresPermissions('system:dict:deleteRecycleBin')") @RequestMapping(value = "/deleteRecycleBin", method = RequestMethod.DELETE) public Result deleteRecycleBin(@RequestParam("ids") String ids) { try { diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java index e1b1893a4cd67eea3a9a558bee62acf74ef65d56..32c366098146544d7e21569b9946685cd44dcbf0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java @@ -4,14 +4,12 @@ package org.jeecg.modules.system.controller; import java.util.Arrays; import java.util.Date; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.commons.lang.StringUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.system.query.QueryGenerator; @@ -20,6 +18,7 @@ import org.jeecg.modules.system.entity.SysDictItem; import org.jeecg.modules.system.service.ISysDictItemService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -74,7 +73,7 @@ public class SysDictItemController { * @功能:新增 * @return */ - @RequiresPermissions("system:dict:item:add") + @PreAuthorize("@jps.requiresPermissions('system:dict:item:add')") @RequestMapping(value = "/add", method = RequestMethod.POST) @CacheEvict(value= {CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) public Result add(@RequestBody SysDictItem sysDictItem) { @@ -95,7 +94,7 @@ public class SysDictItemController { * @param sysDictItem * @return */ - @RequiresPermissions("system:dict:item:edit") + @PreAuthorize("@jps.requiresPermissions('system:dict:item:edit')") @RequestMapping(value = "/edit", method = { RequestMethod.PUT,RequestMethod.POST }) @CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) public Result edit(@RequestBody SysDictItem sysDictItem) { @@ -119,7 +118,7 @@ public class SysDictItemController { * @param id * @return */ - @RequiresPermissions("system:dict:item:delete") + @PreAuthorize("@jps.requiresPermissions('system:dict:item:delete')") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) @CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) public Result delete(@RequestParam(name="id",required=true) String id) { @@ -141,7 +140,7 @@ public class SysDictItemController { * @param ids * @return */ - @RequiresPermissions("system:dict:item:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:dict:item:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) @CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFillRuleController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFillRuleController.java index 7a96fff8122285d48c38bc63e0ba4c4d02687165..7fc843f2d89cb5635135cc7388e83d4acf84376b 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFillRuleController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFillRuleController.java @@ -19,8 +19,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFormFileController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFormFileController.java index 2d6db07dae0712e719c5848c1fb5a50c6c051834..7db3b076f3b8b9ef47064bce6bfc7a1d0ed08df6 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFormFileController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFormFileController.java @@ -16,8 +16,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysGatewayRouteController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysGatewayRouteController.java index 5b2bfbf7e189673e19b48016563824fcf529820d..6c6d11173bfd700976b5b8424520ece9a1f6c0e0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysGatewayRouteController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysGatewayRouteController.java @@ -6,16 +6,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysGatewayRoute; import org.jeecg.modules.system.service.ISysGatewayRouteService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.List; @@ -70,7 +70,7 @@ public class SysGatewayRouteController extends JeecgController delete(@RequestParam(name = "id", required = true) String id) { sysGatewayRouteService.deleteById(id); @@ -96,7 +96,7 @@ public class SysGatewayRouteController extends JeecgController copyRoute(@RequestParam(name = "id", required = true) String id, HttpServletRequest req) { Result result = new Result<>(); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysLogController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysLogController.java index ce475dc793d0e3af77048aca1f9b4cde35d0a6cd..b5878b89b44a5f6fa418f1ebdacc9d154cf32aa3 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysLogController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysLogController.java @@ -3,11 +3,9 @@ package org.jeecg.modules.system.controller; import java.util.Arrays; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; -import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysLog; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java index 20a10a5a6dde18ad8dba21a1a063190bd2a34031..05c705c2f858e281dc372e369c40a2031b958a79 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java @@ -1,13 +1,13 @@ package org.jeecg.modules.system.controller; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.apache.shiro.subject.Subject; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; @@ -16,7 +16,8 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.Md5Util; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.JeecgBaseConfig; -import org.jeecg.config.shiro.ShiroRealm; +import org.jeecg.config.security.JeecgPermissionService; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.constant.DefIndexConst; import org.jeecg.modules.system.entity.*; @@ -25,9 +26,10 @@ import org.jeecg.modules.system.model.TreeModel; import org.jeecg.modules.system.service.*; import org.jeecg.modules.system.util.PermissionDataUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; @@ -67,9 +69,9 @@ public class SysPermissionController { @Autowired private ISysRoleIndexService sysRoleIndexService; - + @Autowired - private ShiroRealm shiroRealm; + private JeecgPermissionService jeecgPermissionService; /** * 子菜单 @@ -245,7 +247,7 @@ public class SysPermissionController { Result result = new Result(); try { //直接获取当前用户不适用前端token - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser loginUser = SecureUtil.currentUser(); if (oConvertUtils.isEmpty(loginUser)) { return Result.error("请登录系统!"); } @@ -357,7 +359,7 @@ public class SysPermissionController { public Result getPermCode() { try { // 直接获取当前用户 - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser loginUser = SecureUtil.currentUser(); if (oConvertUtils.isEmpty(loginUser)) { return Result.error("请登录系统!"); } @@ -398,7 +400,7 @@ public class SysPermissionController { * @param permission * @return */ - @RequiresPermissions("system:permission:add") + @PreAuthorize("@jps.requiresPermissions('system:permission:add')") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody SysPermission permission) { Result result = new Result(); @@ -418,7 +420,7 @@ public class SysPermissionController { * @param permission * @return */ - @RequiresPermissions("system:permission:edit") + @PreAuthorize("@jps.requiresPermissions('system:permission:edit')") @RequestMapping(value = "/edit", method = { RequestMethod.PUT, RequestMethod.POST }) public Result edit(@RequestBody SysPermission permission) { Result result = new Result<>(); @@ -460,7 +462,7 @@ public class SysPermissionController { * @param id * @return */ - @RequiresPermissions("system:permission:delete") + @PreAuthorize("@jps.requiresPermissions('system:permission:delete')") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) public Result delete(@RequestParam(name = "id", required = true) String id) { Result result = new Result<>(); @@ -479,7 +481,7 @@ public class SysPermissionController { * @param ids * @return */ - @RequiresPermissions("system:permission:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:permission:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { Result result = new Result<>(); @@ -587,7 +589,7 @@ public class SysPermissionController { * @return */ @RequestMapping(value = "/saveRolePermission", method = RequestMethod.POST) - @RequiresPermissions("system:permission:saveRole") + @PreAuthorize("@jps.requiresPermissions('system:permission:saveRole')") public Result saveRolePermission(@RequestBody JSONObject json) { long start = System.currentTimeMillis(); Result result = new Result<>(); @@ -597,20 +599,13 @@ public class SysPermissionController { String lastPermissionIds = json.getString("lastpermissionIds"); this.sysRolePermissionService.saveRolePermission(roleId, permissionIds, lastPermissionIds); //update-begin---author:wangshuai ---date:20220316 for:[VUEN-234]用户管理角色授权添加敏感日志------------ - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser loginUser = SecureUtil.currentUser(); baseCommonService.addLog("修改角色ID: "+roleId+" 的权限配置,操作人: " +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); //update-end---author:wangshuai ---date:20220316 for:[VUEN-234]用户管理角色授权添加敏感日志------------ + // 清除权限缓存 + jeecgPermissionService.clearCache(); result.success("保存成功!"); log.info("======角色授权成功=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); - - //update-begin---author:scott ---date:2024-06-18 for:【TV360X-1320】分配权限必须退出重新登录才生效,造成很多用户困扰--- - // 清除当前用户的授权缓存信息 - Subject currentUser = SecurityUtils.getSubject(); - if (currentUser.isAuthenticated()) { - shiroRealm.clearCache(currentUser.getPrincipals()); - } - //update-end---author:scott ---date::2024-06-18 for:【TV360X-1320】分配权限必须退出重新登录才生效,造成很多用户困扰--- - } catch (Exception e) { result.error500("授权失败!"); log.error(e.getMessage(), e); @@ -924,7 +919,7 @@ public class SysPermissionController { * @param sysPermissionDataRule * @return */ - @RequiresPermissions("system:permission:addRule") + @PreAuthorize("@jps.requiresPermissions('system:permission:addRule')") @RequestMapping(value = "/addPermissionRule", method = RequestMethod.POST) public Result addPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { Result result = new Result(); @@ -939,7 +934,7 @@ public class SysPermissionController { return result; } - @RequiresPermissions("system:permission:editRule") + @PreAuthorize("@jps.requiresPermissions('system:permission:editRule')") @RequestMapping(value = "/editPermissionRule", method = { RequestMethod.PUT, RequestMethod.POST }) public Result editPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { Result result = new Result(); @@ -959,7 +954,7 @@ public class SysPermissionController { * @param id * @return */ - @RequiresPermissions("system:permission:deleteRule") + @PreAuthorize("@jps.requiresPermissions('system:permission:deleteRule')") @RequestMapping(value = "/deletePermissionRule", method = RequestMethod.DELETE) public Result deletePermissionRule(@RequestParam(name = "id", required = true) String id) { Result result = new Result(); @@ -1016,7 +1011,7 @@ public class SysPermissionController { * @return */ @RequestMapping(value = "/saveDepartPermission", method = RequestMethod.POST) - @RequiresPermissions("system:permission:saveDepart") + @PreAuthorize("@jps.requiresPermissions('system:permission:saveDepart')") public Result saveDepartPermission(@RequestBody JSONObject json) { long start = System.currentTimeMillis(); Result result = new Result<>(); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java index 5f3de909926ba41f42d7ebe0453c32257004fac1..568d59f63cdb05892512ee6e1afe2aafd7ea396b 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java @@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.config.TenantContext; @@ -18,6 +17,7 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.ImportExcelUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.SysPosition; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.service.ISysPositionService; @@ -29,13 +29,14 @@ import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -247,7 +248,7 @@ public class SysPositionController { //Step.2 AutoPoi 导出Excel ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); List pageList = sysPositionService.list(queryWrapper); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "职务表列表"); mv.addObject(NormalExcelConstants.CLASS, SysPosition.class); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java index 871e39fd9d2bb290fe902d132c993874ecec28f8..c9c35f4aea3b224b56b2aa9688e19f409b75b4ad 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java @@ -1,21 +1,19 @@ package org.jeecg.modules.system.controller; -import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import com.alibaba.fastjson.JSON; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.base.BaseMap; import org.jeecg.common.config.TenantContext; @@ -25,6 +23,7 @@ import org.jeecg.common.modules.redis.client.JeecgRedisClient; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.model.TreeModel; @@ -36,6 +35,8 @@ import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -48,7 +49,6 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import org.jeecg.common.system.vo.LoginUser; -import org.apache.shiro.SecurityUtils; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -96,7 +96,7 @@ public class SysRoleController { * @param req * @return */ - @RequiresPermissions("system:role:list") + @PreAuthorize("@jps.requiresPermissions('system:role:list')") @RequestMapping(value = "/list", method = RequestMethod.GET) public Result> queryPageList(SysRole role, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @@ -152,7 +152,7 @@ public class SysRoleController { * @return */ @RequestMapping(value = "/add", method = RequestMethod.POST) - @RequiresPermissions("system:role:add") + @PreAuthorize("@jps.requiresPermissions('system:role:add')") public Result add(@RequestBody SysRole role) { Result result = new Result(); try { @@ -177,7 +177,7 @@ public class SysRoleController { * @param role * @return */ - @RequiresPermissions("system:role:edit") + @PreAuthorize("@jps.requiresPermissions('system:role:edit')") @RequestMapping(value = "/edit",method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody SysRole role) { Result result = new Result(); @@ -191,7 +191,7 @@ public class SysRoleController { //如果是saas隔离的情况下,判断当前租户id是否是当前租户下的 if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { //获取当前用户 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); String username = "admin"; if (!tenantId.equals(sysrole.getTenantId()) && !username.equals(sysUser.getUsername())) { @@ -214,13 +214,13 @@ public class SysRoleController { * @param id * @return */ - @RequiresPermissions("system:role:delete") + @PreAuthorize("@jps.requiresPermissions('system:role:delete')") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) public Result delete(@RequestParam(name="id",required=true) String id) { //如果是saas隔离的情况下,判断当前租户id是否是当前租户下的 if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ //获取当前用户 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); Long getRoleCount = sysRoleService.getRoleCountByTenantId(id, tenantId); String username = "admin"; @@ -245,7 +245,7 @@ public class SysRoleController { * @param ids * @return */ - @RequiresPermissions("system:role:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:role:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { baseCommonService.addLog("删除角色操作,角色ids:" + ids, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_4); @@ -257,7 +257,7 @@ public class SysRoleController { if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); String[] roleIds = ids.split(SymbolConstant.COMMA); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String username = "admin"; for (String id:roleIds) { Long getRoleCount = sysRoleService.getRoleCountByTenantId(id, tenantId); @@ -324,7 +324,7 @@ public class SysRoleController { * * @return */ - @RequiresPermissions("system:role:queryallNoByTenant") + @PreAuthorize("@jps.requiresPermissions('system:role:queryallNoByTenant')") @RequestMapping(value = "/queryallNoByTenant", method = RequestMethod.GET) public Result> queryallNoByTenant() { Result> result = new Result<>(); @@ -400,7 +400,7 @@ public class SysRoleController { //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME,"角色列表"); mv.addObject(NormalExcelConstants.CLASS,SysRole.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); mv.addObject(NormalExcelConstants.PARAMS,new ExportParams("角色列表数据","导出人:"+user.getRealname(),"导出信息")); mv.addObject(NormalExcelConstants.DATA_LIST,pageList); return mv; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java index e48a8a570aca03ca0b9e989ced04ee8f94cd37d6..6a2e980b2c35652e190620b072c378d49857c64b 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java @@ -1,27 +1,29 @@ package org.jeecg.modules.system.controller; +import java.util.Arrays; + import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; -import org.jeecg.common.aspect.annotation.AutoLog; -import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.modules.system.entity.SysRoleIndex; import org.jeecg.modules.system.service.ISysRoleIndexService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.Arrays; - /** * @Description: 角色首页配置 * @Author: jeecg-boot @@ -64,7 +66,7 @@ public class SysRoleIndexController extends JeecgController updateDefIndex( @RequestParam("url") String url, diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTableWhiteListController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTableWhiteListController.java index 2f09102a6647c1695c7420c681f5982f89aac4ba..2349b0609c89e3589edb41c72a489dbfdc13122d 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTableWhiteListController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTableWhiteListController.java @@ -5,9 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.base.controller.JeecgController; @@ -15,10 +14,9 @@ import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.modules.system.entity.SysTableWhiteList; import org.jeecg.modules.system.service.ISysTableWhiteListService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; - /** * @Description: 系统表白名单 * @Author: jeecg-boot @@ -44,7 +42,7 @@ public class SysTableWhiteListController extends JeecgController queryPageList( SysTableWhiteList sysTableWhiteList, @@ -67,7 +65,7 @@ public class SysTableWhiteListController extends JeecgController add(@RequestBody SysTableWhiteList sysTableWhiteList) { if (sysTableWhiteListService.add(sysTableWhiteList)) { @@ -84,9 +82,9 @@ public class SysTableWhiteListController extends JeecgController edit(@RequestBody SysTableWhiteList sysTableWhiteList) { if (sysTableWhiteListService.edit(sysTableWhiteList)) { @@ -105,7 +103,7 @@ public class SysTableWhiteListController extends JeecgController delete(@RequestParam(name = "id") String id) { if (sysTableWhiteListService.deleteByIds(id)) { @@ -122,9 +120,9 @@ public class SysTableWhiteListController extends JeecgController deleteBatch(@RequestParam(name = "ids") String ids) { if (sysTableWhiteListService.deleteByIds(ids)) { @@ -143,7 +141,7 @@ public class SysTableWhiteListController extends JeecgController queryById(@RequestParam(name = "id", required = true) String id) { SysTableWhiteList sysTableWhiteList = sysTableWhiteListService.getById(id); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java index 5f630cf69a659aeade8446408df819094f5068e7..282e4af86e3d0ccbd9ade002a0aa49281fa24db1 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java @@ -3,13 +3,13 @@ package org.jeecg.modules.system.controller; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.PermissionData; import org.jeecg.common.config.TenantContext; @@ -21,6 +21,7 @@ import org.jeecg.common.util.PasswordUtil; import org.jeecg.common.util.TokenUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.service.ISysTenantPackService; @@ -34,9 +35,11 @@ import org.jeecg.modules.system.vo.tenant.TenantPackModel; import org.jeecg.modules.system.vo.tenant.TenantPackUser; import org.jeecg.modules.system.vo.tenant.TenantPackUserCount; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.*; /** @@ -74,7 +77,7 @@ public class SysTenantController { * @param req * @return */ - @RequiresPermissions("system:tenant:list") + @PreAuthorize("@jps.requiresPermissions('system:tenant:list')") @PermissionData(pageComponent = "system/TenantList") @RequestMapping(value = "/list", method = RequestMethod.GET) public Result> queryPageList(SysTenant sysTenant,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @@ -113,7 +116,7 @@ public class SysTenantController { * @return */ @GetMapping("/recycleBinPageList") - @RequiresPermissions("system:tenant:recycleBinPageList") + @PreAuthorize("@jps.requiresPermissions('system:tenant:recycleBinPageList')") public Result> recycleBinPageList(SysTenant sysTenant,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req){ Result> result = new Result>(); @@ -129,7 +132,7 @@ public class SysTenantController { * @param * @return */ - @RequiresPermissions("system:tenant:add") + @PreAuthorize("@jps.requiresPermissions('system:tenant:add')") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody SysTenant sysTenant) { Result result = new Result(); @@ -155,7 +158,7 @@ public class SysTenantController { * @author chenrui * @date 2025/2/6 18:24 */ - @RequiresPermissions("system:tenant:syncDefaultPack") + @PreAuthorize("@jps.requiresPermissions('system:tenant:syncDefaultPack')") @PostMapping(value = "/syncDefaultPack") public Result syncDefaultPack(@RequestParam(name="tenantId",required=true) Integer tenantId) { //同步默认产品包 @@ -168,7 +171,7 @@ public class SysTenantController { * @param * @return */ - @RequiresPermissions("system:tenant:edit") + @PreAuthorize("@jps.requiresPermissions('system:tenant:edit')") @RequestMapping(value = "/edit", method ={RequestMethod.PUT, RequestMethod.POST}) public Result edit(@RequestBody SysTenant tenant) { Result result = new Result(); @@ -191,14 +194,14 @@ public class SysTenantController { * @param id * @return */ - @RequiresPermissions("system:tenant:delete") + @PreAuthorize("@jps.requiresPermissions('system:tenant:delete')") @RequestMapping(value = "/delete", method ={RequestMethod.DELETE, RequestMethod.POST}) public Result delete(@RequestParam(name="id",required=true) String id) { //------------------------------------------------------------------ //如果是saas隔离的情况下,判断当前租户id是否是当前租户下的 if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { //获取当前用户 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser();; SysTenant sysTenant = sysTenantService.getById(id); String username = "admin"; @@ -219,7 +222,7 @@ public class SysTenantController { * @param ids * @return */ - @RequiresPermissions("system:tenant:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:tenant:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { Result result = new Result<>(); @@ -234,7 +237,7 @@ public class SysTenantController { //如果是saas隔离的情况下,判断当前租户id是否是当前租户下的 if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { //获取当前用户 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); SysTenant sysTenant = sysTenantService.getById(id); String username = "admin"; @@ -269,7 +272,7 @@ public class SysTenantController { } //------------------------------------------------------------------------------------------------ //获取登录用户信息 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】, admin给特权可以管理所有租户 if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && !"admin".equals(sysUser.getUsername())){ Integer loginSessionTenant = oConvertUtils.getInt(TenantContext.getTenant()); @@ -294,7 +297,7 @@ public class SysTenantController { * 查询有效的 租户数据 * @return */ - @RequiresPermissions("system:tenant:queryList") + @PreAuthorize("@jps.requiresPermissions('system:tenant:queryList')") @RequestMapping(value = "/queryList", method = RequestMethod.GET) public Result> queryList(@RequestParam(name="ids",required=false) String ids) { Result> result = new Result>(); @@ -320,7 +323,7 @@ public class SysTenantController { * @return */ @GetMapping(value = "/packList") - @RequiresPermissions("system:tenant:packList") + @PreAuthorize("@jps.requiresPermissions('system:tenant:packList')") public Result> queryPackPageList(SysTenantPack sysTenantPack, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, @@ -342,7 +345,7 @@ public class SysTenantController { * @return */ @PostMapping(value = "/addPackPermission") - @RequiresPermissions("system:tenant:add:pack") + @PreAuthorize("@jps.requiresPermissions('system:tenant:add:pack')") public Result addPackPermission(@RequestBody SysTenantPack sysTenantPack) { sysTenantPackService.addPackPermission(sysTenantPack); return Result.ok("创建租户产品包成功"); @@ -355,7 +358,7 @@ public class SysTenantController { * @return */ @PutMapping(value = "/editPackPermission") - @RequiresPermissions("system:tenant:edit:pack") + @PreAuthorize("@jps.requiresPermissions('system:tenant:edit:pack')") public Result editPackPermission(@RequestBody SysTenantPack sysTenantPack) { sysTenantPackService.editPackPermission(sysTenantPack); return Result.ok("修改租户产品包成功"); @@ -368,7 +371,7 @@ public class SysTenantController { * @return */ @DeleteMapping("/deleteTenantPack") - @RequiresPermissions("system:tenant:delete:pack") + @PreAuthorize("@jps.requiresPermissions('system:tenant:delete:pack')") public Result deleteTenantPack(@RequestParam(value = "ids") String ids) { sysTenantPackService.deleteTenantPack(ids); return Result.ok("删除租户产品包成功"); @@ -385,7 +388,7 @@ public class SysTenantController { public Result> getCurrentUserTenant() { Result> result = new Result>(); try { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //update-begin---author:wangshuai ---date:20221223 for:[QQYUN-3371]租户逻辑改造,改成关系表------------ List tenantIdList = relationService.getTenantIdsByUserId(sysUser.getId()); Map map = new HashMap(5); @@ -411,7 +414,7 @@ public class SysTenantController { * @return */ @PutMapping("/invitationUserJoin") - @RequiresPermissions("system:tenant:invitation:user") + @PreAuthorize("@jps.requiresPermissions('system:tenant:invitation:user')") public Result invitationUserJoin(@RequestParam("ids") String ids,@RequestParam("phone") String phone){ sysTenantService.invitationUserJoin(ids,phone); return Result.ok("邀请用户成功"); @@ -426,7 +429,7 @@ public class SysTenantController { * @return */ @RequestMapping(value = "/getTenantUserList", method = RequestMethod.GET) - @RequiresPermissions("system:tenant:user:list") + @PreAuthorize("@jps.requiresPermissions('system:tenant:user:list')") public Result> getTenantUserList(SysUser user, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, @@ -447,12 +450,12 @@ public class SysTenantController { * @return */ @PutMapping("/leaveTenant") - @RequiresPermissions("system:tenant:leave") + @PreAuthorize("@jps.requiresPermissions('system:tenant:leave')") public Result leaveTenant(@RequestParam("userIds") String userIds, @RequestParam("tenantId") String tenantId){ Result result = new Result<>(); //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && !"admin".equals(sysUser.getUsername())){ Integer loginSessionTenant = oConvertUtils.getInt(TenantContext.getTenant()); if(loginSessionTenant!=null && !loginSessionTenant.equals(Integer.valueOf(tenantId))){ @@ -498,7 +501,7 @@ public class SysTenantController { @PostMapping("/saveTenantJoinUser") public Result saveTenantJoinUser(@RequestBody SysTenant sysTenant){ Result result = new Result<>(); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); Integer tenantId = sysTenantService.saveTenantJoinUser(sysTenant, sysUser.getId()); result.setSuccess(true); result.setMessage("创建成功"); @@ -512,7 +515,7 @@ public class SysTenantController { */ @PostMapping("/joinTenantByHouseNumber") public Result joinTenantByHouseNumber(@RequestBody SysTenant sysTenant){ - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); Integer tenantId = sysTenantService.joinTenantByHouseNumber(sysTenant, sysUser.getId()); Result result = new Result<>(); if(tenantId != 0){ @@ -547,7 +550,7 @@ public class SysTenantController { SysUser user, HttpServletRequest req) { Page page = new Page(pageNo, pageSize); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String tenantId = oConvertUtils.getString(TenantContext.getTenant(), "0"); IPage list = relationService.getUserTenantPageList(page, Arrays.asList(userTenantStatus.split(SymbolConstant.COMMA)), user, Integer.valueOf(tenantId)); return Result.ok(list); @@ -562,7 +565,7 @@ public class SysTenantController { @GetMapping("/getTenantListByUserId") //@RequiresPermissions("system:tenant:getTenantListByUserId") public Result> getTenantListByUserId(@RequestParam(name = "userTenantStatus", required = false) String userTenantStatus) { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); List list = null; if (oConvertUtils.isNotEmpty(userTenantStatus)) { list = Arrays.asList(userTenantStatus.split(SymbolConstant.COMMA)); @@ -595,7 +598,7 @@ public class SysTenantController { @PutMapping("/cancelTenant") //@RequiresPermissions("system:tenant:cancelTenant") public Result cancelTenant(@RequestBody SysTenant sysTenant,HttpServletRequest request) { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); SysTenant tenant = sysTenantService.getById(sysTenant.getId()); if (null == tenant) { return Result.error("未找到当前租户信息"); @@ -638,7 +641,7 @@ public class SysTenantController { */ @PutMapping("/cancelApplyTenant") public Result cancelApplyTenant(@RequestParam("tenantId") String tenantId){ - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); sysTenantService.leaveTenant(sysUser.getId(),tenantId); return Result.ok("取消申请成功"); } @@ -651,7 +654,7 @@ public class SysTenantController { * @return */ @DeleteMapping("/deleteLogicDeleted") - @RequiresPermissions("system:tenant:deleteTenantLogic") + @PreAuthorize("@jps.requiresPermissions('system:tenant:deleteTenantLogic')") public Result deleteTenantLogic(@RequestParam("ids") String ids){ sysTenantService.deleteTenantLogic(ids); return Result.ok("彻底删除成功"); @@ -663,7 +666,7 @@ public class SysTenantController { * @return */ @PutMapping("/revertTenantLogic") - @RequiresPermissions("system:tenant:revertTenantLogic") + @PreAuthorize("@jps.requiresPermissions('system:tenant:revertTenantLogic')") public Result revertTenantLogic(@RequestParam("ids") String ids){ sysTenantService.revertTenantLogic(ids); return Result.ok("还原成功"); @@ -677,7 +680,7 @@ public class SysTenantController { */ @DeleteMapping("/exitUserTenant") public Result exitUserTenant(@RequestBody SysTenant sysTenant,HttpServletRequest request){ - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //验证用户是否已存在 Integer count = relationService.userTenantIzExist(sysUser.getId(),sysTenant.getId()); if (count == 0) { @@ -902,7 +905,7 @@ public class SysTenantController { public Result> getTenantPageListByUserId(SysUserTenantVo sysUserTenantVo, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); List list = null; String userTenantStatus = sysUserTenantVo.getUserTenantStatus(); if (oConvertUtils.isNotEmpty(userTenantStatus)) { @@ -920,7 +923,7 @@ public class SysTenantController { public Result agreeOrRefuseJoinTenant(@RequestParam("tenantId") Integer tenantId, @RequestParam("status") String status){ //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String userId = sysUser.getId(); SysTenant tenant = sysTenantService.getById(tenantId); if(null == tenant){ diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java index a6e2535064cc8536e764ba99eb1b799beebf2591..a6efcf835b516d4f8df7b87ad632b5a5be940614 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * minio文件上传示例 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java index cd6daeed114a26e963c0ed817b7946199b87b3ad..5d59e76f27d37a0daa4406963fe85322ab6d2295 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserAgentController.java @@ -7,14 +7,14 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.SysUserAgent; import org.jeecg.modules.system.service.ISysUserAgentService; import org.jeecgframework.poi.excel.ExcelImportUtil; @@ -216,7 +216,7 @@ public class SysUserAgentController { //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "用户代理人设置列表"); mv.addObject(NormalExcelConstants.CLASS, SysUserAgent.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); ExportParams exportParams = new ExportParams("用户代理人设置列表数据", "导出人:"+user.getRealname(), "导出信息"); exportParams.setImageBasePath(upLoadPath); mv.addObject(NormalExcelConstants.PARAMS, exportParams); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java index 2bd0a8e8128f704013d2163d9f9815666cde15b7..cf0c281494185e1fd53f2ef7221c08365479585c 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java @@ -11,15 +11,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.PermissionData; import org.jeecg.common.base.BaseMap; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; +import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; +import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.common.modules.redis.client.JeecgRedisClient; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.util.JwtUtil; @@ -42,13 +42,14 @@ import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -142,7 +143,7 @@ public class SysUserController { * @param req * @return */ - @RequiresPermissions("system:user:listAll") + @PreAuthorize("@jps.requiresPermissions('system:user:listAll')") @RequestMapping(value = "/listAll", method = RequestMethod.GET) public Result> queryAllPageList(SysUser user, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { @@ -150,7 +151,7 @@ public class SysUserController { return sysUserService.queryPageList(req, queryWrapper, pageSize, pageNo); } - @RequiresPermissions("system:user:add") + @PreAuthorize("@jps.requiresPermissions('system:user:add')") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody JSONObject jsonObject) { Result result = new Result(); @@ -180,7 +181,7 @@ public class SysUserController { return result; } - @RequiresPermissions("system:user:edit") + @PreAuthorize("@jps.requiresPermissions('system:user:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody JSONObject jsonObject) { Result result = new Result(); @@ -219,7 +220,7 @@ public class SysUserController { /** * 删除用户 */ - @RequiresPermissions("system:user:delete") + @PreAuthorize("@jps.requiresPermissions('system:user:delete')") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) public Result delete(@RequestParam(name="id",required=true) String id) { baseCommonService.addLog("删除用户,id: " +id ,CommonConstant.LOG_TYPE_2, 3); @@ -235,7 +236,7 @@ public class SysUserController { /** * 批量删除用户 */ - @RequiresPermissions("system:user:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('system:user:deleteBatch')") @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { baseCommonService.addLog("批量删除用户, ids: " +ids ,CommonConstant.LOG_TYPE_2, 3); @@ -254,7 +255,7 @@ public class SysUserController { * @param jsonObject * @return */ - @RequiresPermissions("system:user:frozenBatch") + @PreAuthorize("@jps.requiresPermissions('system:user:frozenBatch')") @RequestMapping(value = "/frozenBatch", method = RequestMethod.PUT) public Result frozenBatch(@RequestBody JSONObject jsonObject) { Result result = new Result(); @@ -279,7 +280,7 @@ public class SysUserController { } - @RequiresPermissions("system:user:queryById") + @PreAuthorize("@jps.requiresPermissions('system:user:queryById')") @RequestMapping(value = "/queryById", method = RequestMethod.GET) public Result queryById(@RequestParam(name = "id", required = true) String id) { Result result = new Result(); @@ -293,7 +294,7 @@ public class SysUserController { return result; } - @RequiresPermissions("system:user:queryUserRole") + @PreAuthorize("@jps.requiresPermissions('system:user:queryUserRole')") @RequestMapping(value = "/queryUserRole", method = RequestMethod.GET) public Result> queryUserRole(@RequestParam(name = "userid", required = true) String userid) { Result> result = new Result<>(); @@ -346,7 +347,7 @@ public class SysUserController { /** * 修改密码 */ - @RequiresPermissions("system:user:changepwd") + @PreAuthorize("@jps.requiresPermissions('system:user:changepwd')") @RequestMapping(value = "/changePassword", method = RequestMethod.PUT) public Result changePassword(@RequestBody SysUser sysUser) { SysUser u = this.sysUserService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername, sysUser.getUsername())); @@ -355,7 +356,7 @@ public class SysUserController { } sysUser.setId(u.getId()); //update-begin---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser loginUser = SecureUtil.currentUser(); baseCommonService.addLog("修改用户 "+sysUser.getUsername()+" 的密码,操作人: " +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); //update-end---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ return sysUserService.changePassword(sysUser); @@ -470,7 +471,7 @@ public class SysUserController { * @param request * @param sysUser */ - @RequiresPermissions("system:user:export") + @PreAuthorize("@jps.requiresPermissions('system:user:export')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(SysUser sysUser,HttpServletRequest request) { // Step.1 组装查询条件 @@ -488,7 +489,7 @@ public class SysUserController { //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "用户列表"); mv.addObject(NormalExcelConstants.CLASS, SysUser.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); ExportParams exportParams = new ExportParams("用户列表数据", "导出人:"+user.getRealname(), "导出信息"); exportParams.setImageBasePath(upLoadPath); mv.addObject(NormalExcelConstants.PARAMS, exportParams); @@ -503,7 +504,7 @@ public class SysUserController { * @param response * @return */ - @RequiresPermissions("system:user:import") + @PreAuthorize("@jps.requiresPermissions('system:user:import')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response)throws IOException { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; @@ -617,14 +618,14 @@ public class SysUserController { /** * 首页用户重置密码 */ - @RequiresPermissions("system:user:updatepwd") + @PreAuthorize("@jps.requiresPermissions('system:user:updatepwd')") @RequestMapping(value = "/updatePassword", method = RequestMethod.PUT) public Result updatePassword(@RequestBody JSONObject json) { String username = json.getString("username"); String oldpassword = json.getString("oldpassword"); String password = json.getString("password"); String confirmpassword = json.getString("confirmpassword"); - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); if(!sysUser.getUsername().equals(username)){ return Result.error("只允许修改自己的密码!"); } @@ -633,7 +634,7 @@ public class SysUserController { return Result.error("用户不存在!"); } //update-begin---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser loginUser = SecureUtil.currentUser(); baseCommonService.addLog("修改密码,username: " +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); //update-end---author:wangshuai ---date:20220316 for:[VUEN-234]修改密码添加敏感日志------------ return sysUserService.resetPassword(username,oldpassword,password,confirmpassword); @@ -658,7 +659,7 @@ public class SysUserController { * @param * @return */ - @RequiresPermissions("system:user:addUserRole") + @PreAuthorize("@jps.requiresPermissions('system:user:addUserRole')") @RequestMapping(value = "/addSysUserRole", method = RequestMethod.POST) public Result addSysUserRole(@RequestBody SysUserRoleVO sysUserRoleVO) { Result result = new Result(); @@ -690,7 +691,7 @@ public class SysUserController { * @param * @return */ - @RequiresPermissions("system:user:deleteRole") + @PreAuthorize("@jps.requiresPermissions('system:user:deleteRole')") @RequestMapping(value = "/deleteUserRole", method = RequestMethod.DELETE) public Result deleteUserRole(@RequestParam(name="roleId") String roleId, @RequestParam(name="userId",required=true) String userId @@ -714,7 +715,7 @@ public class SysUserController { * @param * @return */ - @RequiresPermissions("system:user:deleteRoleBatch") + @PreAuthorize("@jps.requiresPermissions('system:user:deleteRoleBatch')") @RequestMapping(value = "/deleteUserRoleBatch", method = RequestMethod.DELETE) public Result deleteUserRoleBatch( @RequestParam(name="roleId") String roleId, @@ -746,7 +747,7 @@ public class SysUserController { List subDepids = new ArrayList<>(); //部门id为空时,查询我的部门下所有用户 if(oConvertUtils.isEmpty(depId)){ - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); int userIdentity = user.getUserIdentity() != null?user.getUserIdentity():CommonConstant.USER_IDENTITY_1; //update-begin---author:chenrui ---date:20250107 for:[QQYUN-10775]验证码可以复用 #7674------------ if(oConvertUtils.isNotEmpty(userIdentity) && userIdentity == CommonConstant.USER_IDENTITY_2 @@ -848,7 +849,7 @@ public class SysUserController { /** * 给指定部门添加对应的用户 */ - @RequiresPermissions("system:user:editDepartWithUser") + @PreAuthorize("@jps.requiresPermissions('system:user:editDepartWithUser')") @RequestMapping(value = "/editSysDepartWithUser", method = RequestMethod.POST) public Result editSysDepartWithUser(@RequestBody SysDepartUsersVO sysDepartUsersVO) { Result result = new Result(); @@ -877,7 +878,7 @@ public class SysUserController { /** * 删除指定机构的用户关系 */ - @RequiresPermissions("system:user:deleteUserInDepart") + @PreAuthorize("@jps.requiresPermissions('system:user:deleteUserInDepart')") @RequestMapping(value = "/deleteUserInDepart", method = RequestMethod.DELETE) public Result deleteUserInDepart(@RequestParam(name="depId") String depId, @RequestParam(name="userId",required=true) String userId @@ -909,7 +910,7 @@ public class SysUserController { /** * 批量删除指定机构的用户关系 */ - @RequiresPermissions("system:user:deleteUserInDepartBatch") + @PreAuthorize("@jps.requiresPermissions('system:user:deleteUserInDepartBatch')") @RequestMapping(value = "/deleteUserInDepartBatch", method = RequestMethod.DELETE) public Result deleteUserInDepartBatch( @RequestParam(name="depId") String depId, @@ -941,7 +942,7 @@ public class SysUserController { public Result> getCurrentUserDeparts() { Result> result = new Result>(); try { - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); List list = this.sysDepartService.queryUserDeparts(sysUser.getId()); Map map = new HashMap(5); map.put("list", list); @@ -1289,7 +1290,7 @@ public class SysUserController { * @param userIds 被删除的用户ID,多个id用半角逗号分割 * @return */ - @RequiresPermissions("system:user:deleteRecycleBin") + @PreAuthorize("@jps.requiresPermissions('system:user:deleteRecycleBin')") @RequestMapping(value = "/deleteRecycleBin", method = RequestMethod.DELETE) public Result deleteRecycleBin(@RequestParam("userIds") String userIds) { if (StringUtils.isNotBlank(userIds)) { @@ -1304,7 +1305,7 @@ public class SysUserController { * @param jsonObject * @return */ - @RequiresPermissions("system:user:app:edit") + @PreAuthorize("@jps.requiresPermissions('system:user:app:edit')") @RequestMapping(value = "/appEdit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result appEdit(HttpServletRequest request,@RequestBody JSONObject jsonObject) { Result result = new Result(); @@ -1695,7 +1696,7 @@ public class SysUserController { * @return */ @PostMapping("/login/setting/userEdit") - @RequiresPermissions("system:user:setting:edit") + @PreAuthorize("@jps.requiresPermissions('system:user:setting:edit')") public Result userEdit(@RequestBody SysUser sysUser, HttpServletRequest request) { String username = JwtUtil.getUserNameByToken(request); SysUser user = sysUserService.getById(sysUser.getId()); @@ -1807,7 +1808,7 @@ public class SysUserController { public Result changeLoginTenantId(@RequestBody SysUser sysUser){ Result result = new Result<>(); Integer tenantId = sysUser.getLoginTenantId(); - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser loginUser = SecureUtil.currentUser(); String userId = loginUser.getId(); // 判断 指定的租户ID是不是当前登录用户的租户 diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java index 66abfe6f89b66b12f6b3359b5d4114683387afc8..2a9f6c4698b3a213780fb0841dd137b58791ceac 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java @@ -3,7 +3,6 @@ package org.jeecg.modules.system.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; @@ -17,10 +16,14 @@ import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.jeecg.modules.system.vo.SysUserOnlineVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.CacheManager; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -48,6 +51,10 @@ public class SysUserOnlineController { @Resource private BaseCommonService baseCommonService; + @Autowired + private OAuth2AuthorizationService authorizationService; + @Autowired + private CacheManager cacheManager; @RequestMapping(value = "/list", method = RequestMethod.GET) public Result> list(@RequestParam(name="username", required=false) String username, @@ -120,8 +127,13 @@ public class SysUserOnlineController { redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId()); //清空用户的缓存信息(包括部门信息),例如sys:cache:user:: redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername())); - //调用shiro的logout - SecurityUtils.getSubject().logout(); + //调用logout + OAuth2Authorization authorization = authorizationService.findByToken(online.getToken(), OAuth2TokenType.ACCESS_TOKEN); + + // 清空用户信息 + cacheManager.getCache("user_details").evict(authorization.getPrincipalName()); + // 清空access token + authorizationService.remove(authorization); return Result.ok("退出登录成功!"); }else { return Result.error("Token无效!"); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java index 2098b2440adc72b38518e1f142437eaf1fa23ba3..6c80a0594fe94e08393ba6f3e0707d603766484c 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java @@ -1,11 +1,11 @@ package org.jeecg.modules.system.controller; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.jeecg.dingtalk.api.core.response.Response; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; @@ -17,6 +17,7 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.TokenUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.SysThirdAccount; import org.jeecg.modules.system.entity.SysThirdAppConfig; import org.jeecg.modules.system.service.ISysThirdAccountService; @@ -27,9 +28,10 @@ import org.jeecg.modules.system.vo.thirdapp.JwSysUserDepartVo; import org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo; import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -483,7 +485,7 @@ public class ThirdAppController { */ @GetMapping("/getThirdAccountByUserId") public Result> getThirdAccountByUserId(@RequestParam(name="thirdType") String thirdType){ - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); LambdaQueryWrapper query = new LambdaQueryWrapper<>(); //根据id查询 query.eq(SysThirdAccount::getSysUserId,sysUser.getId()); @@ -514,7 +516,7 @@ public class ThirdAppController { */ @DeleteMapping("/deleteThirdAccount") public Result deleteThirdAccountById(@RequestBody SysThirdAccount sysThirdAccount){ - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); if(!sysUser.getId().equals(sysThirdAccount.getSysUserId())){ return Result.error("无权修改他人信息"); } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java index 59260b142713789bffe195c037edb6ae5f977bd4..9b1ab1f5e6901651c47a68bc58f77c88347da7d6 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java @@ -11,7 +11,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.request.AuthRequest; import me.zhyd.oauth.utils.AuthStateUtils; -import me.zhyd.oauth.utils.StringUtils; +import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.enums.MessageTypeEnum; @@ -36,8 +36,8 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java index 437c596e0670851fe35c6e624f420ba0f5f92dfb..9cc4259158bc4e84cf73dce605d006ba41b7a114 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java @@ -1,7 +1,5 @@ package org.jeecg.modules.system.controller; -import javax.servlet.http.HttpServletResponse; - import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.modules.system.util.XssUtils; @@ -9,6 +7,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import jakarta.servlet.http.HttpServletResponse; import java.io.PrintWriter; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java index 3eca93234c3fdd5421fccb8b57adeef676b953fd..efcfa601598fc8b3ffb1ae3e6e79448b79ef220a 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java @@ -1,5 +1,6 @@ package org.jeecg.modules.system.entity; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; @@ -7,9 +8,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.config.security.utils.SecureUtil; import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.security.core.context.SecurityContextHolder; import java.io.Serializable; import java.util.Date; @@ -93,7 +95,7 @@ public class SysDataLog implements Serializable { */ public void autoSetCreateName() { try { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); this.setCreateName(sysUser.getRealname()); } catch (Exception e) { log.warn("SecurityUtils.getSubject() 获取用户信息异常:" + e.getMessage()); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java index 52d03d9d6da30c73fe63e0c96c150ff356174a03..d37c473e3a98a05743f7ca3f0caa268eb5cb9655 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java @@ -61,7 +61,7 @@ public class SysUser implements Serializable { /** * md5密码盐 */ - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @JsonProperty(access = JsonProperty.Access.READ_WRITE) private String salt; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCommentService.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCommentService.java index 8c39b593ec29e888cb6f94c76760177a892697fb..4c865d4fe706e5b01552f2bcb99e7380a3071cb0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCommentService.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCommentService.java @@ -5,7 +5,7 @@ import org.jeecg.modules.system.entity.SysComment; import org.jeecg.modules.system.vo.SysCommentFileVo; import org.jeecg.modules.system.vo.SysCommentVO; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java index 5944f95341739651aa9db0696f6300c4a3e93e4c..63c3a326895af9e900784a4250036a204983037a 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -11,7 +11,7 @@ import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.vo.SysDepartExportVo; import org.jeecg.modules.system.vo.lowapp.ExportDepartVo; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java index 2b33a84d4ec9a83026cc9949b0d182e7d02f3535..f1b83514f85e3d799f8194f61d43f90a744ea86e 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java @@ -17,7 +17,7 @@ import org.jeecg.modules.system.vo.lowapp.UpdateDepartInfo; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Collection; import java.util.List; import java.util.Map; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementSendServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementSendServiceImpl.java index a0b96485dae873a9c9fcb43634291097a6fd82ca..7e84e717690c5a39e55055ccbbe5e940072d948d 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementSendServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementSendServiceImpl.java @@ -2,7 +2,7 @@ package org.jeecg.modules.system.service.impl; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.jeecg.modules.system.entity.SysAnnouncementSend; import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java index 4127474bc3e347cfb4544f62699b65b0c3fdb2b6..e520d771e12dd1b823331d87a67e17b070344495 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java @@ -1,16 +1,17 @@ package org.jeecg.modules.system.service.impl; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.SecurityUtils; +import org.apache.commons.lang.StringUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.DateRangeUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.SysAnnouncement; import org.jeecg.modules.system.entity.SysAnnouncementSend; import org.jeecg.modules.system.mapper.SysAnnouncementMapper; @@ -19,11 +20,12 @@ import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.service.ISysAnnouncementSendService; import org.jeecg.modules.system.service.ISysAnnouncementService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.SynchronousQueue; @@ -155,7 +157,7 @@ public class SysAnnouncementServiceImpl extends ServiceImpl announcementIds = this.getNotSendedAnnouncementlist(userId); List sysAnnouncementSendList = new ArrayList<>(); @@ -205,7 +207,7 @@ public class SysAnnouncementServiceImpl extends ServiceImpl page = new Page(pageNo,pageSize); List list = baseMapper.queryAllMessageList(page, sysUser.getId(), fromUser, starFlag, beginDate, endDate); @@ -214,13 +216,13 @@ public class SysAnnouncementServiceImpl extends ServiceImpl annoceIdList) { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); sysAnnouncementSendMapper.updateReaded(sysUser.getId(), annoceIdList); } @Override public void clearAllUnReadMessage() { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); sysAnnouncementSendMapper.clearAllUnReadMessage(sysUser.getId()); } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index 3c8ed8eb202d53fd625650d19dece272a15dd931..1963a4fadcdaed9038dc66768d6ba50d4d67edc1 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -17,10 +17,10 @@ import freemarker.template.TemplateException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ObjectUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.dto.DataLogDTO; import org.jeecg.common.api.dto.OnlineAuthDTO; import org.jeecg.common.api.dto.message.*; +import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.UrlMatchEnum; import org.jeecg.common.constant.*; import org.jeecg.common.constant.enums.EmailTemplateEnum; @@ -39,6 +39,7 @@ import org.jeecg.common.util.dynamic.db.FreemarkerParseFactory; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.message.entity.SysMessageTemplate; import org.jeecg.modules.message.handle.impl.DdSendMsgHandle; import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle; @@ -54,13 +55,14 @@ import org.jeecg.modules.system.vo.lowapp.SysDictVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.util.AntPathMatcher; import org.springframework.util.CollectionUtils; import org.springframework.util.PathMatcher; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.sql.DataSource; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -169,6 +171,19 @@ public class SysBaseApiImpl implements ISysBaseAPI { } + @Override + public LoginUser getUserByPhone(String phone) { + if (oConvertUtils.isEmpty(phone)) { + return null; + } + + LoginUser loginUser = new LoginUser(); + SysUser sysUser = sysUserService.getUserByPhone(phone); + + BeanUtils.copyProperties(sysUser, loginUser); + return loginUser; + } + @Override public String translateDictFromTable(String table, String text, String code, String key) { return sysDictService.queryTableDictTextByKey(table, text, code, key); @@ -632,7 +647,7 @@ public class SysBaseApiImpl implements ISysBaseAPI { public void updateSysAnnounReadFlag(String busType, String busId) { SysAnnouncement announcement = sysAnnouncementMapper.selectOne(new QueryWrapper().eq("bus_type",busType).eq("bus_id",busId)); if(announcement != null){ - LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); String userId = sysUser.getId(); LambdaUpdateWrapper updateWrapper = new UpdateWrapper().lambda(); updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG); @@ -1551,6 +1566,27 @@ public class SysBaseApiImpl implements ISysBaseAPI { } //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + @Override + public Map> queryAllDictItems() { + return sysDictService.queryAllDictItems(); + } + + @Override + public List queryUserDeparts(String userId) { + List list = new ArrayList<>(); + for (SysDepart sysDepartService: sysDepartService.queryUserDeparts(userId)) { + SysDepartModel model = new SysDepartModel(); + BeanUtils.copyProperties(sysDepartService, model); + list.add(model); + } + return list; + } + + @Override + public void updateUserDepart(String username, String orgCode, Integer loginTenantId) { + sysUserService.updateUserDepart(username, orgCode,null); + } + //-------------------------------------流程节点发送模板消息----------------------------------------------- @Autowired private QywxSendMsgHandle qywxSendMsgHandle; @@ -1825,4 +1861,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { } } + @Override + public JSONObject setLoginTenant(String username) { + JSONObject obj = new JSONObject(new LinkedHashMap<>()); + SysUser sysUser = sysUserService.getUserByName(username); + sysUserService.setLoginTenant(sysUser, obj, username, null); + return obj; + } } \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCommentServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCommentServiceImpl.java index 31dfa83ae84cc7f4277881a87ef7094eff331882..cee144b28094eaf4e58db29225c628c75b1bafb8 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCommentServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCommentServiceImpl.java @@ -33,7 +33,7 @@ import org.springframework.util.FileCopyUtils; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.util.*; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java index 9fe2dfb108d30505e42982f2c704954b4b8dc718..aa7b538e6d5c49b0d956b2297bc81e6919ede16b 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.*; import java.util.stream.Collectors; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java index 10c19db220292f2a12e57e83400285cc5cd70a6d..6a5a71de82a69e1b821d051c9fcb610dae0adf43 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.*; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleServiceImpl.java index 11ca6c6ebb9563cb1f53f1959ce7843541bf262d..5984c77da6941c0fee724e317d70bc1a763f45b4 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleServiceImpl.java @@ -11,7 +11,6 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; import java.util.List; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java index 444561986d6b226dd2d50122054d39b3b764d8b0..aac9e7fefe42f509979961df266190be1a889274 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -2,6 +2,7 @@ package org.jeecg.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -12,7 +13,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.FillRuleConstant; @@ -23,6 +23,7 @@ import org.jeecg.common.util.ImportExcelUtil; import org.jeecg.common.util.YouBianCodeUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.*; import org.jeecg.modules.system.model.DepartIdModel; @@ -32,6 +33,8 @@ import org.jeecg.modules.system.util.FindsDepartsChildrenUtil; import org.jeecg.modules.system.vo.SysDepartExportVo; import org.jeecg.modules.system.vo.lowapp.ExportDepartVo; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -857,7 +860,7 @@ public class SysDepartServiceImpl extends ServiceImpl getMyDepartList() { - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser(); String userId = user.getId(); //字典code集合 List list = new ArrayList<>(); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java index ce96662d6a6959ddaa1559f5c42e29c06dbbfa3c..8d76a2a192c787bda98c6d38953e15fe51d4d476 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -265,6 +265,7 @@ public class SysDictServiceImpl extends ServiceImpl impl code = SqlInjectionUtil.getSqlInjectField(code); //return sysDictMapper.queryTableDictItemsByCode(tableFilterSql,text,code); + table = table.toLowerCase(); return sysDictMapper.queryTableDictWithFilter(table,text,code,filterSql); } @@ -290,7 +291,7 @@ public class SysDictServiceImpl extends ServiceImpl impl table = SqlInjectionUtil.getSqlInjectTableName(table); text = SqlInjectionUtil.getSqlInjectField(text); code = SqlInjectionUtil.getSqlInjectField(code); - + table = table.toLowerCase(); return sysDictMapper.queryTableDictWithFilter(table,text,code,filterSql); } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java index e226c3cbd89c3bfb0de9ad5f4918cbe7a26da4c3..2cdb4af19485d948d079457ece348f30b0034b2f 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java @@ -5,7 +5,7 @@ import java.util.Date; import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import com.baomidou.mybatisplus.annotation.DbType; import org.jeecg.common.system.api.ISysBaseAPI; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java index be7c3f782a8d851e948a7351166f21a48640c4da..304e61c3dd85b168bf378e98eb9d490632c52ab2 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java @@ -4,7 +4,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.query.QueryGenerator; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java index 8cba97d3be6d82439c0810ff321efcf26fc2386a..3f1c6a1d9eeb18f326b422b7951234e31794535e 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java @@ -25,7 +25,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.*; /** diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java index 6103c56afd9a1eab1443d6f4dfb258228f963e72..35f4c641dc014b5fe659f3c5fafaa37abcf466a0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java @@ -15,7 +15,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** *

diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java index 8de75c18a8090a3fdfb0a7a23c26464b7ead8f70..9b791729c2d9667453557833449c04b3868f0db4 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java @@ -1,12 +1,13 @@ package org.jeecg.modules.system.service.impl; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.constant.TenantConstant; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.aop.TenantLog; import org.jeecg.modules.system.entity.SysPackPermission; import org.jeecg.modules.system.entity.SysTenant; @@ -19,11 +20,13 @@ import org.jeecg.modules.system.mapper.SysTenantPackUserMapper; import org.jeecg.modules.system.service.ISysTenantPackService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; +import javax.sql.DataSource; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -147,7 +150,7 @@ public class SysTenantPackServiceImpl extends ServiceImpl invitationUser(String phone, String departId) { Result result = new Result<>(); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //1、查询用户信息,判断用户是否存在 SysUser userByPhone = userService.getUserByPhone(phone); @@ -442,7 +442,7 @@ public class SysTenantServiceImpl extends ServiceImpl pageList = null; // 部门ID不存在 直接查询用户表即可 Page page = new Page<>(pageNo, pageSize); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); if(oConvertUtils.isEmpty(departId)){ LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(SysUser::getStatus,Integer.parseInt(CommonConstant.STATUS_1)); @@ -271,7 +273,7 @@ public class SysUserDepartServiceImpl extends ServiceImpl pageList = null; // 部门ID不存在 直接查询用户表即可 Page page = new Page<>(pageNo, pageSize); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); List userIdList = new ArrayList<>(); if(oConvertUtils.isNotEmpty(excludeUserIdList)){ diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java index f2f656beca59211cc42bd31cbee3389189e0d828..ca65dc66d739c893ecf28185b64255e6a810ba48 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java @@ -2,6 +2,7 @@ package org.jeecg.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.exceptions.ClientException; @@ -15,7 +16,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ObjectUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; @@ -33,6 +33,7 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.SysUserCacheInfo; import org.jeecg.common.util.*; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.modules.base.service.BaseCommonService; import org.jeecg.modules.message.handle.impl.SystemSendMsgHandle; import org.jeecg.modules.system.entity.*; @@ -59,14 +60,16 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -104,13 +107,13 @@ public class SysUserServiceImpl extends ServiceImpl impl @Autowired private SysThirdAccountMapper sysThirdAccountMapper; @Autowired - ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; + ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; @Autowired - ThirdAppDingtalkServiceImpl dingtalkService; + ThirdAppDingtalkServiceImpl dingtalkService; @Autowired - ISysRoleIndexService sysRoleIndexService; + ISysRoleIndexService sysRoleIndexService; @Autowired - SysTenantMapper sysTenantMapper; + SysTenantMapper sysTenantMapper; @Autowired private SysUserTenantMapper relationMapper; @Autowired @@ -121,8 +124,10 @@ public class SysUserServiceImpl extends ServiceImpl impl private SysPositionMapper sysPositionMapper; @Autowired private SystemSendMsgHandle systemSendMsgHandle; + @Autowired private ISysThirdAccountService sysThirdAccountService; + @Autowired private RedisUtil redisUtil; @@ -1572,7 +1577,7 @@ public class SysUserServiceImpl extends ServiceImpl impl //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "用户列表"); mv.addObject(NormalExcelConstants.CLASS, AppExportUserVo.class); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser user = SecureUtil.currentUser();; ExportParams exportParams = new ExportParams("导入规则:\n" + "1、存在用户编号时,数据会根据用户编号进行匹配,匹配成功后只会更新职位和工号;\n" + "2、不存在用户编号时,支持手机号、邮箱、姓名、部们、职位、工号导入,其中手机号必填;\n" + @@ -1880,7 +1885,7 @@ public class SysUserServiceImpl extends ServiceImpl impl userTenantMapper.insert(userTenant); //update-begin---author:wangshuai ---date:20230710 for:【QQYUN-5731】导入用户时,没有提醒------------ //发送系统消息通知 - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); MessageDTO messageDTO = new MessageDTO(); String title = sysUser.getRealname() + " 邀请您加入 " + tenantName + "。"; messageDTO.setTitle(title); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java index 0177ef6ebc51d967712c96246ee77447b1c32a7a..6c57782c6d37feb04246de6de3adad0b1192eaec 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.commons.lang.StringUtils; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.SymbolConstant; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java index 0be039eaab53b42f4293d0a736b32a53f89d2198..33344c093b95520ba30ee5d8481d4879f3c242d3 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java @@ -1,7 +1,7 @@ package org.jeecg.modules.system.util; import javax.imageio.ImageIO; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index e28c476459db70fa479b04d5a922635de4d70966..3bb758f11c87544c15bdc4edc5aa9cb4ef5916cc 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -8,8 +8,8 @@ import java.util.stream.Collectors; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; @@ -37,7 +37,7 @@ import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.aspect.annotation.AutoLog; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.security.access.prepost.PreAuthorize; <#assign bpm_flag=false> <#assign has_multi_query_field=false> <#list originalColumns as po> @@ -105,7 +105,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-添加") @Operation(summary="${tableVo.ftlDescription}-添加") - @RequiresPermissions("${entityPackage}:${tableName}:add") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:add')") @PostMapping(value = "/add") public Result add(@RequestBody ${entityName} ${entityName?uncap_first}) { <#if bpm_flag> @@ -123,7 +123,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-编辑") @Operation(summary="${tableVo.ftlDescription}-编辑") - @RequiresPermissions("${entityPackage}:${tableName}:edit") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody ${entityName} ${entityName?uncap_first}) { ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); @@ -138,7 +138,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") @Operation(summary="${tableVo.ftlDescription}-通过id删除") - @RequiresPermissions("${entityPackage}:${tableName}:delete") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:delete')") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { ${entityName?uncap_first}Service.removeById(id); @@ -153,7 +153,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-批量删除") @Operation(summary="${tableVo.ftlDescription}-批量删除") - @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:deleteBatch')") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); @@ -183,7 +183,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e * @param request * @param ${entityName?uncap_first} */ - @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:exportXls')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, "${tableVo.ftlDescription}"); @@ -196,7 +196,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e * @param response * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { return super.importExcel(request, response, ${entityName}.class); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index 00ee5fc497f58d1435147f95f755bab73e4416d8..ab9c57d282f98c683a8b3c6cb578f9c9f8322a61 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -9,8 +9,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -18,7 +18,7 @@ import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.jeecg.common.system.vo.LoginUser; -import org.apache.shiro.SecurityUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; @@ -45,7 +45,7 @@ import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.aspect.annotation.AutoLog; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.security.access.prepost.PreAuthorize; <#assign bpm_flag=false> <#list originalColumns as po> <#if po.fieldDbName=='bpm_status'> @@ -101,7 +101,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-添加") @Operation(summary="${tableVo.ftlDescription}-添加") - @RequiresPermissions("${entityPackage}:${tableName}:add") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:add')") @PostMapping(value = "/add") public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -121,7 +121,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-编辑") @Operation(summary="${tableVo.ftlDescription}-编辑") - @RequiresPermissions("${entityPackage}:${tableName}:edit") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -142,7 +142,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") @Operation(summary="${tableVo.ftlDescription}-通过id删除") - @RequiresPermissions("${entityPackage}:${tableName}:delete") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:delete')") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { ${entityName?uncap_first}Service.delMain(id); @@ -157,7 +157,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-批量删除") @Operation(summary="${tableVo.ftlDescription}-批量删除") - @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:deleteBatch')") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); @@ -204,12 +204,12 @@ public class ${entityName}Controller { * @param request * @param ${entityName?uncap_first} */ - @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:exportXls')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { // Step.1 组装查询条件查询数据 QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //配置选中数据查询条件 String selections = request.getParameter("selections"); @@ -248,7 +248,7 @@ public class ${entityName}Controller { * @param response * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index e828ed6dc045cecc0320cac4296db40ccfbc64e0..a7ef5cbc15c3f87607be9e67295a5277ab0fdad0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -7,8 +7,8 @@ import java.util.stream.Collectors; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; @@ -33,10 +33,10 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.aspect.annotation.AutoLog; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; /** * @Description: ${tableVo.ftlDescription} @@ -207,7 +207,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-添加") @Operation(summary="${tableVo.ftlDescription}-添加") - @RequiresPermissions("${entityPackage}:${tableName}:add") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:add')") @PostMapping(value = "/add") public Result add(@RequestBody ${entityName} ${entityName?uncap_first}) { ${entityName?uncap_first}Service.add${entityName}(${entityName?uncap_first}); @@ -222,7 +222,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-编辑") @Operation(summary="${tableVo.ftlDescription}-编辑") - @RequiresPermissions("${entityPackage}:${tableName}:edit") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody ${entityName} ${entityName?uncap_first}) { ${entityName?uncap_first}Service.update${entityName}(${entityName?uncap_first}); @@ -237,7 +237,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") @Operation(summary="${tableVo.ftlDescription}-通过id删除") - @RequiresPermissions("${entityPackage}:${tableName}:delete") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:delete')") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { ${entityName?uncap_first}Service.delete${entityName}(id); @@ -252,7 +252,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-批量删除") @Operation(summary="${tableVo.ftlDescription}-批量删除") - @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:deleteBatch')") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); @@ -282,7 +282,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e * @param request * @param ${entityName?uncap_first} */ - @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:exportXls')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, "${tableVo.ftlDescription}"); @@ -295,7 +295,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e * @param response * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { return super.importExcel(request, response, ${entityName}.class); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index d957608c6598805db7430fafea7538a434e10f12..d28be092a9014407d04bb1bc75660f8be195b9b0 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -10,8 +10,8 @@ import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.api.vo.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import java.util.Arrays; import java.util.HashMap; @@ -27,7 +27,7 @@ import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.aspect.annotation.AutoLog; -import org.apache.shiro.SecurityUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -40,12 +40,12 @@ import java.io.IOException; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.security.access.prepost.PreAuthorize; <#assign has_multi_query_field=false> <#list originalColumns as po> -<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> - <#assign has_multi_query_field=true> - + <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + <#assign has_multi_query_field=true> + /** * @Description: ${tableVo.ftlDescription} @@ -110,7 +110,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-添加") @Operation(summary="${tableVo.ftlDescription}-添加") - @RequiresPermissions("${entityPackage}:${tableName}:add") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:add')") @PostMapping(value = "/add") public Result add(@RequestBody ${entityName} ${entityName?uncap_first}) { ${entityName?uncap_first}Service.save(${entityName?uncap_first}); @@ -124,7 +124,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-编辑") @Operation(summary="${tableVo.ftlDescription}-编辑") - @RequiresPermissions("${entityPackage}:${tableName}:edit") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody ${entityName} ${entityName?uncap_first}) { ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); @@ -138,7 +138,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") @Operation(summary="${tableVo.ftlDescription}-通过id删除") - @RequiresPermissions("${entityPackage}:${tableName}:delete") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:delete')") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { ${entityName?uncap_first}Service.delMain(id); @@ -152,7 +152,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e */ @AutoLog(value = "${tableVo.ftlDescription}-批量删除") @Operation(summary="${tableVo.ftlDescription}-批量删除") - @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:deleteBatch')") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); @@ -163,7 +163,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e * 导出 * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:exportXls')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, "${tableVo.ftlDescription}"); @@ -173,7 +173,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e * 导入 * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { return super.importExcel(request, response, ${entityName}.class); @@ -260,7 +260,7 @@ public class ${entityName}Controller extends JeecgController<${entityName}, I${e public ModelAndView export${sub.entityName}(HttpServletRequest request, ${sub.entityName} ${sub.entityName?uncap_first}) { // Step.1 组装查询条件 QueryWrapper<${sub.entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${sub.entityName?uncap_first}, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); // Step.2 获取导出数据 List<${sub.entityName}> pageList = ${sub.entityName?uncap_first}Service.list(queryWrapper); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index 284707347b52e32897b2491eb03a8e9b153432df..41772c07ab7cf4615dd96b026860ea1a387cd4d8 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -10,8 +10,8 @@ import java.util.Map; import java.util.HashMap; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -19,7 +19,7 @@ import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.jeecg.common.system.vo.LoginUser; -import org.apache.shiro.SecurityUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; @@ -47,7 +47,8 @@ import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.aspect.annotation.AutoLog; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.security.access.prepost.PreAuthorize; + <#assign has_multi_query_field=false> <#list originalColumns as po> <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> @@ -114,7 +115,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-添加") @Operation(summary="${tableVo.ftlDescription}-添加") - @RequiresPermissions("${entityPackage}:${tableName}:add") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:add')") @PostMapping(value = "/add") public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -131,7 +132,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-编辑") @Operation(summary="${tableVo.ftlDescription}-编辑") - @RequiresPermissions("${entityPackage}:${tableName}:edit") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -152,7 +153,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") @Operation(summary="${tableVo.ftlDescription}-通过id删除") - @RequiresPermissions("${entityPackage}:${tableName}:delete") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:delete')") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { ${entityName?uncap_first}Service.delMain(id); @@ -167,7 +168,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-批量删除") @Operation(summary="${tableVo.ftlDescription}-批量删除") - @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:deleteBatch')") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); @@ -218,12 +219,12 @@ public class ${entityName}Controller { * @param request * @param ${entityName?uncap_first} */ - @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:exportXls')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { // Step.1 组装查询条件查询数据 QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //配置选中数据查询条件 String selections = request.getParameter("selections"); @@ -262,7 +263,7 @@ public class ${entityName}Controller { * @param response * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index 37f1675c7e0e0deddd1e3f6197894d04df041aeb..739f7d931cdf9080644f1e6ac40626b8dfc0eafa 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -10,8 +10,8 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.HashMap; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -19,7 +19,7 @@ import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.jeecg.common.system.vo.LoginUser; -import org.apache.shiro.SecurityUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; @@ -47,7 +47,7 @@ import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.aspect.annotation.AutoLog; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.security.access.prepost.PreAuthorize; <#assign bpm_flag=false> <#assign has_multi_query_field=false> @@ -123,7 +123,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-添加") @Operation(summary="${tableVo.ftlDescription}-添加") - @RequiresPermissions("${entityPackage}:${tableName}:add") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:add')") @PostMapping(value = "/add") public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -143,7 +143,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-编辑") @Operation(summary="${tableVo.ftlDescription}-编辑") - @RequiresPermissions("${entityPackage}:${tableName}:edit") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -164,7 +164,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") @Operation(summary="${tableVo.ftlDescription}-通过id删除") - @RequiresPermissions("${entityPackage}:${tableName}:delete") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:delete')") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { ${entityName?uncap_first}Service.delMain(id); @@ -179,7 +179,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-批量删除") @Operation(summary="${tableVo.ftlDescription}-批量删除") - @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:deleteBatch')") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); @@ -226,12 +226,12 @@ public class ${entityName}Controller { * @param request * @param ${entityName?uncap_first} */ - @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:exportXls')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { // Step.1 组装查询条件查询数据 QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //配置选中数据查询条件 String selections = request.getParameter("selections"); @@ -270,7 +270,7 @@ public class ${entityName}Controller { * @param response * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index 4032647d25f69297968c5aab1266f59970dcabca..31f8b550ff8b8d1e2b2f5aa9a58946ca730c8a70 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -10,8 +10,8 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.HashMap; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -19,7 +19,7 @@ import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.jeecg.common.system.vo.LoginUser; -import org.apache.shiro.SecurityUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; @@ -47,7 +47,8 @@ import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.aspect.annotation.AutoLog; -import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.security.access.prepost.PreAuthorize; + <#assign has_multi_query_field=false> <#list originalColumns as po> <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> @@ -114,7 +115,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-添加") @Operation(summary="${tableVo.ftlDescription}-添加") - @RequiresPermissions("${entityPackage}:${tableName}:add") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:add')") @PostMapping(value = "/add") public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -131,7 +132,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-编辑") @Operation(summary="${tableVo.ftlDescription}-编辑") - @RequiresPermissions("${entityPackage}:${tableName}:edit") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:edit')") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { ${entityName} ${entityName?uncap_first} = new ${entityName}(); @@ -152,7 +153,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") @Operation(summary="${tableVo.ftlDescription}-通过id删除") - @RequiresPermissions("${entityPackage}:${tableName}:delete") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:delete')") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { ${entityName?uncap_first}Service.delMain(id); @@ -167,7 +168,7 @@ public class ${entityName}Controller { */ @AutoLog(value = "${tableVo.ftlDescription}-批量删除") @Operation(summary="${tableVo.ftlDescription}-批量删除") - @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:deleteBatch')") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); @@ -214,12 +215,12 @@ public class ${entityName}Controller { * @param request * @param ${entityName?uncap_first} */ - @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:exportXls')") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { // Step.1 组装查询条件查询数据 QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //配置选中数据查询条件 String selections = request.getParameter("selections"); @@ -258,7 +259,7 @@ public class ${entityName}Controller { * @param response * @return */ - @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @PreAuthorize("@jps.requiresPermissions('${entityPackage}:${tableName}:importExcel')") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index 3651338eefcec2274cbc85855371b24657728ba4..5d556322be67419521ed1a6d12e8da7ac99655fc 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -6,8 +6,8 @@ import java.util.Map; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.aspect.annotation.AutoLog; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai index ac72a567decb40c7f37ab48c7e8508f600b60f35..fd924d02c92162c1fc5d90589e52c8f26ee9797f 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai @@ -7,8 +7,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index f4f08bd6051d2bcb82ed30313f6195a56ca051c8..c0589f5e16b151b7a3c1e1a4ee3eff6c132da6fd 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -8,10 +8,10 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.jeecg.common.system.vo.LoginUser; -import org.apache.shiro.SecurityUtils; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; @@ -185,7 +185,7 @@ public class ${entityName}Controller { public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { // Step.1 组装查询条件 QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //Step.2 获取导出数据 List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai index 853d1f0ced2bdeefd12c6e6d986bd86cb9d88028..7e4bb249fbcb18b67da34e40e3294839039df45a 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -8,9 +8,9 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.shiro.SecurityUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jeecg.config.security.utils.SecureUtil; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; @@ -273,7 +273,7 @@ ${sub.entityName?uncap_first}.get${key}()!=null<#rt/> public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { // Step.1 组装查询条件 QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + LoginUser sysUser = SecureUtil.currentUser(); //Step.2 获取导出数据 List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/Dockerfile b/jeecg-boot/jeecg-module-system/jeecg-system-start/Dockerfile index cadff106bdc4e420486f91e7145624fde7056460..4278c69c8c41af8fb7186662a85bce742f715082 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/Dockerfile +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/Dockerfile @@ -11,6 +11,6 @@ WORKDIR /jeecg-boot EXPOSE 8080 #ADD ./src/main/resources/jeecg ./config/jeecg -ADD ./target/jeecg-system-start-3.8.0.jar ./ +ADD ./target/jeecg-system-start-3.8.1.jar ./ -CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-start-3.8.0.jar \ No newline at end of file +CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-start-3.8.1.jar \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml index c882acc9541842679a90a0fd390b54f29b245c00..7a34237f4a47d51f3199b3f160a75d0eeed43490 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml @@ -5,7 +5,7 @@ jeecg-module-system org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 @@ -25,17 +25,22 @@ ${jeecgboot.version} - - - org.jeecgframework.boot - jeecg-boot-module-airag - ${jeecgboot.version} - - - + + + + org.springframework.boot + spring-boot-properties-migrator + runtime + + + + jakarta.servlet + jakarta.servlet-api diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java index 85dc8970c5216ff7b8977959168f00ae16f7d4e9..843cbc4f49a071fa3ce1a94f95200e7480468908 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java @@ -1,12 +1,15 @@ package org.jeecg; +import com.xkcoding.justauth.autoconfigure.JustAuthAutoConfiguration; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.util.oConvertUtils; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Import; import org.springframework.core.env.Environment; import java.net.InetAddress; @@ -16,9 +19,12 @@ import java.util.Map; /** * 单体启动类 +* 报错提醒: 未集成mongo报错,可以打开启动类上面的注释 exclude={MongoAutoConfiguration.class} */ @Slf4j @SpringBootApplication +@ImportAutoConfiguration(JustAuthAutoConfiguration.class) // spring boot 3.x justauth 兼容性处理 +//@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class}) public class JeecgSystemApplication extends SpringBootServletInitializer { @Override @@ -40,8 +46,8 @@ public class JeecgSystemApplication extends SpringBootServletInitializer { String path = oConvertUtils.getString(env.getProperty("server.servlet.context-path")); log.info("\n----------------------------------------------------------\n\t" + "Application Jeecg-Boot is running! Access URLs:\n\t" + - "Local: \t\thttp://localhost:" + port + path + "/\n\t" + - "External: \thttp://" + ip + ":" + port + path + "/\n\t" + + "Local: \t\thttp://localhost:" + port + path + "/doc.html\n\t" + + "External: \thttp://" + ip + ":" + port + path + "/doc.html\n\t" + "Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" + "----------------------------------------------------------"); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java index 5cecf2b0db17213b401d83bc3980d45281b7512d..129f1632a6eedccb126c2b19c52fe946793a0067 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java @@ -2,8 +2,6 @@ package org.jeecg.config.flyway; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import lombok.extern.slf4j.Slf4j; -import org.flywaydb.core.Flyway; -import org.flywaydb.core.api.FlywayException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -11,7 +9,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; -import javax.annotation.PostConstruct; import javax.sql.DataSource; import java.util.Map; @@ -96,42 +93,42 @@ public class FlywayConfig { */ @Value("${spring.flyway.clean-disabled:true}") private Boolean cleanDisabled; - - @PostConstruct - public void migrate() { - if(!enabled){ - return; - } - - DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; - Map dataSources = ds.getDataSources(); - dataSources.forEach((k, v) -> { - if("master".equals(k)){ - String databaseType = environment.getProperty("spring.datasource.dynamic.datasource." + k + ".url"); - if (databaseType != null && databaseType.contains("mysql")) { - try { - Flyway flyway = Flyway.configure() - .dataSource(v) - .locations(locations) - .encoding(encoding) - .sqlMigrationPrefix(sqlMigrationPrefix) - .sqlMigrationSeparator(sqlMigrationSeparator) - .placeholderPrefix(placeholderPrefix) - .placeholderSuffix(placeholderSuffix) - .sqlMigrationSuffixes(sqlMigrationSuffixes) - .validateOnMigrate(validateOnMigrate) - .baselineOnMigrate(baselineOnMigrate) - .cleanDisabled(cleanDisabled) - .load(); - flyway.migrate(); - log.info("【数据库升级】平台集成了MySQL库的Flyway,数据库版本自动升级! "); - } catch (FlywayException e) { - log.error("【数据库升级】flyway执行sql脚本失败", e); - } - } else { - log.warn("【数据库升级】平台只集成了MySQL库的Flyway,实现了数据库版本自动升级! 其他类型的数据库,您可以考虑手工升级~"); - } - } - }); - } + +// @Bean +// public void migrate() { +// if(!enabled){ +// return; +// } +// +// DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; +// Map dataSources = ds.getDataSources(); +// dataSources.forEach((k, v) -> { +// if("master".equals(k)){ +// String databaseType = environment.getProperty("spring.datasource.dynamic.datasource." + k + ".url"); +// if (databaseType != null && databaseType.contains("mysql")) { +// try { +// Flyway flyway = Flyway.configure() +// .dataSource(v) +// .locations(locations) +// .encoding(encoding) +// .sqlMigrationPrefix(sqlMigrationPrefix) +// .sqlMigrationSeparator(sqlMigrationSeparator) +// .placeholderPrefix(placeholderPrefix) +// .placeholderSuffix(placeholderSuffix) +// .sqlMigrationSuffixes(sqlMigrationSuffixes) +// .validateOnMigrate(validateOnMigrate) +// .baselineOnMigrate(baselineOnMigrate) +// .cleanDisabled(cleanDisabled) +// .load(); +// flyway.migrate(); +// log.info("【升级提示】平台集成了MySQL库的Flyway,数据库版本自动升级! "); +// } catch (FlywayException e) { +// log.error("【升级提示】flyway执行sql脚本失败", e); +// } +// } else { +// log.warn("【升级提示】平台只集成了MySQL库的Flyway,实现了数据库版本自动升级! 其他类型的数据库,您可以考虑手工升级~"); +// } +// } +// }); +// } } \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 28d0de2099fa7793b0881a38163c5e28ac5072b6..ad6c3d9c5e00fb198055830214cbfefcca3c70e8 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -21,7 +21,7 @@ management: endpoints: web: exposure: - include: metrics,jeecghttptrace + include: metrics,httpexchanges,jeecghttptrace spring: flyway: @@ -107,7 +107,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: @@ -139,7 +139,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,wall,slf4j + filters: stat,slf4j # 允许SELECT语句的WHERE子句是一个永真条件 wall: selectWhereAlwayTrueCheck: false @@ -160,11 +160,12 @@ spring: #password: root #driver-class-name: com.mysql.cj.jdbc.Driver #redis 配置 - redis: - database: 0 - host: 127.0.0.1 - port: 6379 - password: + data: + redis: + database: 0 + host: 127.0.0.1 + port: 6379 + password: #mybatis plus 设置 mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -222,8 +223,6 @@ jeecg: upload: /opt/upFiles #webapp文件路径 webapp: /opt/webapp - shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/** #阿里云oss存储和大鱼短信秘钥配置 oss: accessKey: ?? @@ -288,6 +287,7 @@ cas: #Mybatis输出sql日志 logging: level: + org.springframework.context.support.PostProcessorRegistrationDelegate: error org.flywaydb: debug org.jeecg.modules.system.mapper: info knife4j: @@ -324,3 +324,11 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +security: + oauth2: + client: + ignore-urls: + - /test/jeecgDemo/demo3 + - /test/jeecgDemo/redisDemo/** + - /jmreport/bigscreen2/** \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dm8.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dm8.yml index e8a1820a71da2e92c0364a478978a2210b157427..80b25186879a213de52804767e6d8c784b43cda9 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dm8.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dm8.yml @@ -104,7 +104,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: @@ -134,11 +134,12 @@ spring: password: SYSDBA driverClassName: dm.jdbc.driver.DmDriver #redis 配置 - redis: - database: 0 - host: 127.0.0.1 - port: 6379 - password: '' + data: + redis: + database: 0 + host: 127.0.0.1 + port: 6379 + password: '' #mybatis plus 设置 mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -196,8 +197,6 @@ jeecg: upload: /opt/upFiles #webapp文件路径 webapp: /opt/webapp - shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/** #阿里云oss存储和大鱼短信秘钥配置 oss: accessKey: ?? @@ -245,6 +244,7 @@ cas: #Mybatis输出sql日志 logging: level: + org.springframework.context.support.PostProcessorRegistrationDelegate: error org.flywaydb: debug org.jeecg.modules.system.mapper: info #swagger @@ -282,3 +282,11 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +security: + oauth2: + client: + ignore-urls: + - /test/jeecgDemo/demo3 + - /test/jeecgDemo/redisDemo/** + - /jmreport/bigscreen2/** \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-kingbase8.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-kingbase8.yml index 2ccfb69d105ebca87a4b92fe59ad3d069bd7be60..8732c64517efc075c5cc97dfd5694273cfd89796 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-kingbase8.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-kingbase8.yml @@ -104,7 +104,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: @@ -148,11 +148,12 @@ spring: password: system driver-class-name: com.kingbase8.Driver #redis 配置 - redis: - database: 0 - host: 127.0.0.1 - port: 6379 - password: '' + data: + redis: + database: 0 + host: 127.0.0.1 + port: 6379 + password: '' #mybatis plus 设置 mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -210,8 +211,6 @@ jeecg: upload: /opt/upFiles #webapp文件路径 webapp: /opt/webapp - shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/** #阿里云oss存储和大鱼短信秘钥配置 oss: accessKey: ?? @@ -259,6 +258,7 @@ cas: #Mybatis输出sql日志 logging: level: + org.springframework.context.support.PostProcessorRegistrationDelegate: error org.flywaydb: debug org.jeecg.modules.system.mapper: info #swagger @@ -296,3 +296,11 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +security: + oauth2: + client: + ignore-urls: + - /test/jeecgDemo/demo3 + - /test/jeecgDemo/redisDemo/** + - /jmreport/bigscreen2/** \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml index 427b21a908daaf365c55c1ed45c6de4b0319af43..b5277065095b519fe4513ed913c12b944f90d26d 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml @@ -17,12 +17,12 @@ management: endpoints: web: exposure: - include: metrics,jeecghttptrace + include: metrics,httpexchanges,jeecghttptrace spring: flyway: # 是否启用flyway - enabled: true + enabled: false # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库,非常重要!!! clean-disabled: true servlet: @@ -99,7 +99,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: @@ -131,7 +131,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,wall,slf4j + filters: stat,slf4j # 允许SELECT语句的WHERE子句是一个永真条件 wall: selectWhereAlwayTrueCheck: false @@ -152,11 +152,12 @@ spring: #password: root #driver-class-name: com.mysql.cj.jdbc.Driver #redis 配置 - redis: - database: 0 - host: 127.0.0.1 - port: 6379 - password: '' + data: + redis: + database: 0 + host: 127.0.0.1 + port: 6379 + password: '' #mybatis plus 设置 mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -214,8 +215,6 @@ jeecg: upload: /opt/jeecg-boot/upload #webapp文件路径 webapp: /opt/jeecg-boot/webapp - shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**,/api/getUserInfo #阿里云oss存储和大鱼短信秘钥配置 oss: accessKey: ?? @@ -283,6 +282,7 @@ cas: #Mybatis输出sql日志 logging: level: + org.springframework.context.support.PostProcessorRegistrationDelegate: error org.flywaydb: debug org.jeecg.modules.system.mapper: info #swagger @@ -320,3 +320,12 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +security: + oauth2: + client: + ignore-urls: + - /test/jeecgDemo/demo3 + - /test/jeecgDemo/redisDemo/** + - /jmreport/bigscreen2/** + - /api/getUserInfo \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml index 413d71569e6391a05520af005814901ce2573997..472d5eaabfb193f54f2a2dc1f5c741a89bf73c7a 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml @@ -17,12 +17,12 @@ management: endpoints: web: exposure: - include: metrics,jeecghttptrace + include: metrics,httpexchanges,jeecghttptrace spring: flyway: # 是否启用flyway - enabled: true + enabled: false # 迁移sql脚本存放路径 locations: classpath:flyway/sql/mysql # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库,非常重要!!! @@ -102,7 +102,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration datasource: druid: @@ -134,7 +134,7 @@ spring: poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,wall,slf4j + filters: stat,slf4j # 允许SELECT语句的WHERE子句是一个永真条件 wall: selectWhereAlwayTrueCheck: false @@ -155,11 +155,12 @@ spring: #password: root #driver-class-name: com.mysql.cj.jdbc.Driver #redis 配置 - redis: - database: 0 - host: 192.168.1.188 - port: 6379 - password: '' + data: + redis: + database: 0 + host: 127.0.0.1 + port: 6379 + password: '' #mybatis plus 设置 mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -217,8 +218,6 @@ jeecg: upload: D://opt//upFiles #webapp文件路径 webapp: D://opt//webapp - shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/** #阿里云oss存储和大鱼短信秘钥配置 oss: accessKey: ?? @@ -281,6 +280,7 @@ jeecg: #Mybatis输出sql日志 logging: level: + org.springframework.context.support.PostProcessorRegistrationDelegate: error org.flywaydb: debug org.jeecg.modules.system.mapper: info #cas单点登录 @@ -321,3 +321,11 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +security: + oauth2: + client: + ignore-urls: + - /test/jeecgDemo/demo3 + - /test/jeecgDemo/redisDemo/** + - /jmreport/bigscreen2/** \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java index 98258617d713784277640a9f688ba032f796e1d4..6bd0ac3a4d37ea6c9c24e9511dc79bcdd0d63b0a 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java @@ -1,5 +1,6 @@ package org.jeecg.modules.system.test; +import jakarta.annotation.Resource; import org.jeecg.JeecgSystemApplication; import org.jeecg.modules.demo.mock.MockController; import org.jeecg.modules.demo.test.entity.JeecgDemo; @@ -9,7 +10,6 @@ import org.jeecg.modules.system.service.ISysDataLogService; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.util.Assert; -import javax.annotation.Resource; import java.util.List; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class) diff --git a/jeecg-boot/jeecg-module-system/pom.xml b/jeecg-boot/jeecg-module-system/pom.xml index a78ebaff7b21f44f8127b5f77ea0d1b2cb7b1ce9..92d114c412889b26b6a65bea1fb9a3a8f95cbb2b 100644 --- a/jeecg-boot/jeecg-module-system/pom.xml +++ b/jeecg-boot/jeecg-module-system/pom.xml @@ -5,7 +5,7 @@ jeecg-boot-parent org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/Dockerfile b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/Dockerfile index a9923174b836aadbba443540a865bc1b68504884..9417aa3d474a2615b461455cbb22a1667456e063 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/Dockerfile +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/Dockerfile @@ -10,6 +10,6 @@ WORKDIR /jeecg-cloud-gateway EXPOSE 9999 -ADD ./target/jeecg-cloud-gateway-3.8.0.jar ./ +ADD ./target/jeecg-cloud-gateway-3.8.1.jar ./ -CMD sleep 100;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-gateway-3.8.0.jar \ No newline at end of file +CMD sleep 100;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-gateway-3.8.1.jar \ No newline at end of file diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml index 844fc7e301ed685ede0b435eeacc71bc27819104..85271e54fc32754fe26b289a2ab05b8cef0bd773 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml @@ -5,7 +5,7 @@ jeecg-server-cloud org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 jeecg-cloud-gateway @@ -14,7 +14,7 @@ org.jeecgframework.boot - jeecg-boot-starter-cloud + jeecg-boot-starter3-cloud org.jeecgframework.boot @@ -28,8 +28,8 @@ spring-cloud-starter-gateway - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api @@ -58,10 +58,10 @@ sentinel-datasource-nacos - + diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/JeecgGatewayApplication.java b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/JeecgGatewayApplication.java index 3da36d24c5753c466dc16beefccd44d3aa734484..8d4c3f69ccf9e89c6fb2f0260e2408886fbff5fa 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/JeecgGatewayApplication.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/JeecgGatewayApplication.java @@ -13,7 +13,7 @@ import org.springframework.http.MediaType; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import static org.springframework.web.reactive.function.server.RequestPredicates.GET; import static org.springframework.web.reactive.function.server.RouterFunctions.route; @@ -46,7 +46,7 @@ public class JeecgGatewayApplication implements CommandLineRunner { /** * 接口地址(通过9999端口直接访问) - * + * 已使用knife4j-gateway支持该功能 * @param indexHtml * @return */ diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/sentinel/GatewaySentinelExceptionConfig.java b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/sentinel/GatewaySentinelExceptionConfig.java index a4e8e132e28c9f6bb16cd4c269f06a12266143d5..3e39582df5011f420bb16230337e8ab06af97beb 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/sentinel/GatewaySentinelExceptionConfig.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/sentinel/GatewaySentinelExceptionConfig.java @@ -10,7 +10,7 @@ import org.springframework.http.MediaType; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.server.ServerResponse; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import java.util.HashMap; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/filter/SentinelFilterContextConfig.java b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/filter/SentinelFilterContextConfig.java index 8d0ad94bd34bb524ed7271861de824f953b52d7a..f926efb99b95f70f0735115db4cc0e4ac769a87f 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/filter/SentinelFilterContextConfig.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/filter/SentinelFilterContextConfig.java @@ -1,25 +1,25 @@ -package org.jeecg.filter; - -import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @author: zyf - * @date: 20210715 - */ -@Configuration -public class SentinelFilterContextConfig { - @Bean - public FilterRegistrationBean sentinelFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setFilter(new CommonFilter()); - registration.addUrlPatterns("/*"); - // 入口资源关闭聚合 - registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false"); - registration.setName("sentinelFilter"); - registration.setOrder(1); - return registration; - } -} \ No newline at end of file +//package org.jeecg.filter; +// +//import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; +//import org.springframework.boot.web.servlet.FilterRegistrationBean; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +///** 升级spring boot 3后,无法找到平替 +// * @author: zyf +// * @date: 20210715 +// */ +//@Configuration +//public class SentinelFilterContextConfig { +// @Bean +// public FilterRegistrationBean sentinelFilterRegistration() { +// FilterRegistrationBean registration = new FilterRegistrationBean(); +// registration.setFilter(new CommonFilter()); +// registration.addUrlPatterns("/*"); +// // 入口资源关闭聚合 +// registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false"); +// registration.setName("sentinelFilter"); +// registration.setOrder(1); +// return registration; +// } +//} \ No newline at end of file diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/LoderRouderHandler.java b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/LoderRouderHandler.java index dabe02789297a40ca09e7d0b8b950cd64404dfcd..a22086313cef876eaa539f3c660ae578aca294d7 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/LoderRouderHandler.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/LoderRouderHandler.java @@ -7,7 +7,7 @@ import org.jeecg.common.modules.redis.listener.JeecgRedisListener; import org.jeecg.loader.DynamicRouteLoader; import org.springframework.stereotype.Component; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** * 路由刷新监听(实现方式:redis监听handler) diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/Dockerfile b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/Dockerfile index a47e877b8ed01a2a9c73213fec0f1d9cbcc4660c..472940a3d165e32b3f41ac3f3354c2b3c0f819f6 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/Dockerfile +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/Dockerfile @@ -10,6 +10,6 @@ WORKDIR /jeecg-cloud-nacos EXPOSE 8848 -ADD ./target/jeecg-cloud-nacos-3.8.0.jar ./ +ADD ./target/jeecg-cloud-nacos-3.8.1.jar ./ -CMD sleep 30;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-nacos-3.8.0.jar \ No newline at end of file +CMD sleep 30;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-nacos-3.8.1.jar \ No newline at end of file diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-dev.yaml b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-dev.yaml index 99a0f12f3655e812840ee3c4bbba8bd3ba4d07fa..565549284cf7bb16372f88018c21ecf50c7948e2 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-dev.yaml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-dev.yaml @@ -30,11 +30,12 @@ spring: username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver - redis: - database: 0 - host: jeecg-boot-redis - password: - port: 6379 + data: + redis: + database: 0 + host: jeecg-boot-redis + password: + port: 6379 rabbitmq: host: jeecg-boot-rabbitmq username: guest @@ -62,8 +63,6 @@ jeecg: path: upload: /opt/upFiles webapp: /opt/webapp - shiro: - excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/** oss: endpoint: oss-cn-beijing.aliyuncs.com accessKey: ?? @@ -143,4 +142,15 @@ third-app: enabled: false client-id: ?? client-secret: ?? - agent-id: ?? \ No newline at end of file + agent-id: ?? + +security: + oauth2: + client: + ignore-urls: + - /test/jeecgDemo/demo3 + - /test/jeecgDemo/redisDemo/** + - /category/** + - /visual/** + - /map/** + - /jmreport/bigscreen2/** \ No newline at end of file diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-gateway-dev.yaml b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-gateway-dev.yaml index 0ac5bed70171b0b7561824fdc72c5cee14ff6399..8caf4a0c89b2db275e2c20ef4aabc0efb88c19fd 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-gateway-dev.yaml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-gateway-dev.yaml @@ -6,8 +6,9 @@ jeecg: group: DEFAULT_GROUP data-id: jeecg-gateway-router spring: - redis: - database: 0 - host: jeecg-boot-redis - port: 6379 - password: \ No newline at end of file + data: + redis: + database: 0 + host: jeecg-boot-redis + port: 6379 + password: \ No newline at end of file diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg.yaml b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg.yaml index 5178eba91b69f22216a15a115324066a98e87060..26de44dfd6d476fc42fb9f5776165d58761f94cc 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg.yaml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg.yaml @@ -88,7 +88,7 @@ spring: resource: static-locations: classpath:/static/,classpath:/public/ autoconfigure: - exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure mybatis-plus: mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml global-config: diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/db/nacos_dm.sql b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/db/nacos_dm.sql index b2b52baa7e881d96fc0a6d679b2144483cdfbb2c..7f2b6a392ff8dbf92593462bdd3e1c0b815aa938 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/db/nacos_dm.sql +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/db/nacos_dm.sql @@ -521,7 +521,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration #mybatis plus 设置 mybatis-plus: @@ -978,7 +978,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -1511,7 +1511,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration #mybatis plus 设置 mybatis-plus: @@ -1963,7 +1963,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -2396,7 +2396,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml @@ -2834,7 +2834,7 @@ spring: static-locations: classpath:/static/,classpath:/public/ autoconfigure: exclude: - - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration mybatis-plus: mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/pom.xml index 9acc5733bb088e8879fcaded3d80d5007e00c926..c5da0c8392b7c8e264d6c536f8a0ae747ae073cb 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-nacos jeecg-cloud-nacos nacos启动模块 - 3.8.0 + 3.8.1 org.springframework.boot diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/JeecgNacosApplication.java b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/JeecgNacosApplication.java index 7eaf95cb5a62d4bbfe7475fe21c9076a67e7cbcb..ed4b41575df8575732df77ff12972fa69e32a754 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/JeecgNacosApplication.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/JeecgNacosApplication.java @@ -6,9 +6,9 @@ import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; - import javax.servlet.http.HttpServletResponse; + /** * Nacos 启动类 * diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/Dockerfile b/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/Dockerfile index 786b1f2626485efa62906a7816e3a1969e9e2223..ad1536dfdfa2e06fadb2a478b60fb0afca1d65cc 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/Dockerfile +++ b/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/Dockerfile @@ -10,6 +10,6 @@ WORKDIR /jeecg-demo-cloud EXPOSE 7002 -ADD ./target/jeecg-demo-cloud-start-3.8.0.jar ./ +ADD ./target/jeecg-demo-cloud-start-3.8.1.jar ./ -CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-demo-cloud-start-3.8.0.jar +CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-demo-cloud-start-3.8.1.jar diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/pom.xml index e673256bc8149d09c70901c513b166a1c6efe006..b31c58e5a2d4ad3342e1df74a60c6420a5e68f34 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/pom.xml @@ -5,7 +5,7 @@ jeecg-server-cloud org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 @@ -16,7 +16,7 @@ org.jeecgframework.boot - jeecg-boot-starter-cloud + jeecg-boot-starter3-cloud @@ -26,7 +26,7 @@ org.jeecgframework.boot - jeecg-boot-starter-job + jeecg-boot-starter3-job diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/Dockerfile b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/Dockerfile index b5dbb013e77fb8a068af17c9ba78d5559ad554a6..c2084f50e194ad916db948b0ee8763859f6971c5 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/Dockerfile +++ b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/Dockerfile @@ -10,6 +10,6 @@ WORKDIR /jeecg-system-cloud EXPOSE 7001 -ADD ./target/jeecg-system-cloud-start-3.8.0.jar ./ +ADD ./target/jeecg-system-cloud-start-3.8.1.jar ./ -CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-cloud-start-3.8.0.jar \ No newline at end of file +CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-cloud-start-3.8.1.jar \ No newline at end of file diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml index 6310ade2d7125ca5b5945895c9b067ad1b914d26..d864423bf75ed47b285f5cdb431ced6b026bffe2 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml @@ -5,7 +5,7 @@ jeecg-server-cloud org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 jeecg-system-cloud-start @@ -15,7 +15,7 @@ org.jeecgframework.boot - jeecg-boot-starter-cloud + jeecg-boot-starter3-cloud org.springframework.boot diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/config/SecuritySecureConfig.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/config/SecuritySecureConfig.java index fc48e05fa16818f1f02c6a889406d09ec6b9727c..cd49b69b78a0ab4ce636750fbce1c63b3f0c7949 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/config/SecuritySecureConfig.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/config/SecuritySecureConfig.java @@ -2,8 +2,9 @@ package org.jeecg.monitor.config; import de.codecentric.boot.admin.server.config.AdminServerProperties; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; @@ -11,7 +12,7 @@ import org.springframework.security.web.csrf.CookieCsrfTokenRepository; * @author scott */ @Configuration -public class SecuritySecureConfig extends WebSecurityConfigurerAdapter { +public class SecuritySecureConfig { private final String adminContextPath; @@ -20,32 +21,40 @@ public class SecuritySecureConfig extends WebSecurityConfigurerAdapter { } - @Override - protected void configure(HttpSecurity http) throws Exception { + public SecurityFilterChain configure(HttpSecurity http) throws Exception { // 登录成功处理类 SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); successHandler.setDefaultTargetUrl(adminContextPath + "/"); - http.authorizeRequests() - //静态文件允许访问 - .antMatchers(adminContextPath + "/assets/**").permitAll() - //登录页面允许访问 - .antMatchers(adminContextPath + "/login", "/css/**", "/js/**", "/image/*").permitAll() - //其他所有请求需要登录 - .anyRequest().authenticated() - .and() - //登录页面配置,用于替换security默认页面 - .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and() - //登出页面配置,用于替换security默认页面 - .logout().logoutUrl(adminContextPath + "/logout").and() - .httpBasic().and() - .csrf() - .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) - .ignoringAntMatchers( - "/instances", - "/actuator/**" - ); + http.authorizeRequests(authorize -> { + try { + authorize + + //静态文件允许访问 + .requestMatchers(adminContextPath + "/assets/**").permitAll() + //登录页面允许访问 + .requestMatchers(adminContextPath + "/login", "/css/**", "/js/**", "/image/*").permitAll() + //其他所有请求需要登录 + .anyRequest().authenticated() + .and() + //登录页面配置,用于替换security默认页面 + .formLogin(formLogin -> formLogin.loginPage(adminContextPath + "/login").successHandler(successHandler)) + //登出页面配置,用于替换security默认页面 + .logout(logout -> logout.logoutUrl(adminContextPath + "/logout")) + .httpBasic(Customizer.withDefaults()) + .csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) + .ignoringRequestMatchers( + "/instances", + "/actuator/**") + ); + } catch (Exception e) { + e.printStackTrace(); + } + } + ); + + return http.build(); } diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/resources/application.yml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/resources/application.yml index dfd31b8f6a3477e391ed9312cc2f4f989372aa70..f137704a7c2576e426e64b380496466ba2ab44eb 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/resources/application.yml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/resources/application.yml @@ -20,13 +20,14 @@ spring: nacos: discovery: server-addr: @config.server-addr@ + namespace: @config.namespace@ metadata: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password} # 服务端点检查 management: - trace: - http: + httpexchanges: + recording: enabled: true endpoints: web: diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/Dockerfile b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/Dockerfile index f71c5fa79bc770b3a875257c423508329c5695de..c3c537dbda2592cb18c9b7e4650f4ac1f6fc7389 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/Dockerfile +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/Dockerfile @@ -10,6 +10,6 @@ WORKDIR /jeecg-cloud-sentinel EXPOSE 8848 -ADD ./target/jeecg-cloud-sentinel-3.8.0.jar ./ +ADD ./target/jeecg-cloud-sentinel-3.8.1.jar ./ -CMD sleep 5;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-sentinel-3.8.0.jar +CMD sleep 5;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-sentinel-3.8.1.jar diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/pom.xml index ee15b5f498ccfec4206ef959d309f4799360e40c..66c73870a14aa365a033f83a894a2ca577f5548a 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/pom.xml @@ -3,15 +3,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - jeecg-visual - org.jeecgframework.boot - 3.8.0 + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + jeecg-cloud-sentinel jeecg-cloud-sentinel sentinel启动模块 + + org.projectlombok + lombok + org.jeecgframework.cloud sentinel-dashboard diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/resources/application.yml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/resources/application.yml index 017cd904cd5bb3b49d98fa4609e598f2efd7bcf0..05ffee650f9f307b2bb7bd7bd24b68239514690d 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/resources/application.yml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/resources/application.yml @@ -12,7 +12,7 @@ spring: mvc: #Spring Boot 2.6+\u540E\u6620\u5C04\u5339\u914D\u7684\u9ED8\u8BA4\u7B56\u7565\u5DF2\u4ECEAntPathMatcher\u66F4\u6539\u4E3APathPatternParser,\u9700\u8981\u624B\u52A8\u6307\u5B9A\u4E3Aant-path-matcher pathmatch: - matching-strategy: ant-path-matcher + matching-strategy: ant_path_matcher #auth settings auth: filter: @@ -29,7 +29,7 @@ logging: name: ${user.home}/logs/csp/sentinel-dashboard.log nacos: server: - ip: @config.server-addr@ + ip: localhost:8848 sentinel: dashboard: version: 1.8.2 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/pom.xml index bb15c29eb64a8248055906f5804dd622c8421d3f..5060573ac00511aedadafae797dce67403a23393 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-test org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 公共测试模块 @@ -15,7 +15,7 @@ org.jeecgframework.boot - jeecg-boot-starter-cloud + jeecg-boot-starter3-cloud @@ -27,17 +27,17 @@ org.jeecgframework.boot - jeecg-boot-starter-job + jeecg-boot-starter3-job org.jeecgframework.boot - jeecg-boot-starter-rabbitmq + jeecg-boot-starter3-rabbitmq org.jeecgframework.boot - jeecg-boot-starter-lock + jeecg-boot-starter3-lock diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/pom.xml index c5dc19cdfcd32e279fa7408a2d02def7b62824a3..cbf01caa2404862a47d2012c5d375361bf383d87 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-test org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 消息队列测试模块 @@ -15,7 +15,7 @@ org.jeecgframework.boot - jeecg-boot-starter-rabbitmq + jeecg-boot-starter3-rabbitmq diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/controller/JeecgMqTestController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/controller/JeecgMqTestController.java index cfd93881284cc5140ee02a90f4a6b010ce696f1c..550740e001cd9a61df69715837454f5b866e999c 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/controller/JeecgMqTestController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/controller/JeecgMqTestController.java @@ -1,7 +1,9 @@ package org.jeecg.modules.test.rabbitmq.controller; -import javax.servlet.http.HttpServletRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/pom.xml index 61c4b02d639585bd0c3d3d5db433cde6c76014b0..69359ab51aed561261606f52c992dbbe72f97244 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/pom.xml @@ -5,7 +5,7 @@ org.jeecgframework.boot jeecg-cloud-test - 3.8.0 + 3.8.1 4.0.0 消息队列测试模块 @@ -15,7 +15,7 @@ org.jeecgframework.boot - jeecg-boot-starter-rocketmq + jeecg-boot-starter3-rocketmq diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java index fd7e3167c6ead000a6ee69c58882cc7774c88205..c26dbc08b38268464529172c9888e6faa6701c0c 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/pom.xml index 8def08be97acfbdf0b2eb791edb351c9a980efac..7e8ef0fbe929cd6d9e3ea006e5de486f59cd4b7f 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-test-seata org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 分布式事务测试模块 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/service/impl/SeataAccountServiceImpl.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/service/impl/SeataAccountServiceImpl.java index dbc7f79c0ff7df598ddb4be0f81a04370dbcfbc6..fd5c2f14ac5a6a2281b0e437186fb24ecde75861 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/service/impl/SeataAccountServiceImpl.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/service/impl/SeataAccountServiceImpl.java @@ -13,7 +13,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.math.BigDecimal; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/resources/application.yml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/resources/application.yml index cc5108ab1f882f5084efb36c264138e4da3c0470..9df3c2e8f68c7d6a8a3dc3d61731ca06a09980c4 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/resources/application.yml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/resources/application.yml @@ -1,6 +1,15 @@ server: port: 5002 spring: + data: + redis: + ##redis 单机环境配置 + host: localhost + port: 6379 + database: 0 + password: + ssl: + enabled: false application: name: seata-account main: @@ -13,8 +22,13 @@ spring: password: root driver-class-name: com.mysql.cj.jdbc.Driver schema: classpath:sql/schema-account.sql + cloud: + nacos: + config: + import-check: + enabled: false seata: -# enable-auto-data-source-proxy: false +# enable-auto-data-source-proxy: true service: grouplist: default: 127.0.0.1:8091 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/pom.xml index 27a44d2ac3a4c24afe55faedef180693c910b85f..8c8a761fb4fd4799c2fd8fe47f801f3a441898c5 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-test-seata org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 分布式事务测试模块 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/dto/PlaceOrderRequest.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/dto/PlaceOrderRequest.java index 0010f1aa9fb6187ab3afb97caea251e0490b4967..359b8c853704e06fd955a8c0ba8bb4a393ab1d42 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/dto/PlaceOrderRequest.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/dto/PlaceOrderRequest.java @@ -4,7 +4,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; /** * @Description: 订单请求对象 * @author: zyf diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/service/impl/SeataOrderServiceImpl.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/service/impl/SeataOrderServiceImpl.java index ee7bb02b658502f466248de28f175343b9c16bab..8c68dedc9b9067390460c184940228ea505222d5 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/service/impl/SeataOrderServiceImpl.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/service/impl/SeataOrderServiceImpl.java @@ -16,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.math.BigDecimal; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/resources/application.yml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/resources/application.yml index 8b1635df4047f15be22e660e228fa86ccc8f8286..f1e69de6c39727dd45ea38aa7a55920522af8795 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/resources/application.yml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/resources/application.yml @@ -1,6 +1,15 @@ server: port: 5001 spring: + data: + redis: + ##redis 单机环境配置 + host: localhost + port: 6379 + database: 0 + password: + ssl: + enabled: false application: name: seata-order main: @@ -13,6 +22,11 @@ spring: username: root password: root schema: classpath:sql/schema-order.sql + cloud: + nacos: + config: + import-check: + enabled: false seata: # enable-auto-data-source-proxy: false service: diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/pom.xml index 934f2023a0283d14cac03d41e10647d723717276..87471d621d0c85cd8f38ba980775e8101627ab07 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-test-seata org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 分布式事务测试模块 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/controller/SeataProductController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/controller/SeataProductController.java index 04b33ec9b5e33fef1cd2b67e9d717cef12954e86..c858a207e0ba3dfea3c50913f399fa117504a726 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/controller/SeataProductController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/controller/SeataProductController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import jakarta.servlet.http.HttpServletRequest; import java.math.BigDecimal; /** @@ -19,7 +20,7 @@ public class SeataProductController { private SeataProductService seataProductService; @PostMapping("/reduceStock") - public BigDecimal reduceStock(Long productId, Integer count) { + public BigDecimal reduceStock(Long productId, Integer count, HttpServletRequest request) { return seataProductService.reduceStock(productId, count); } } diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/service/impl/SeataProductServiceImpl.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/service/impl/SeataProductServiceImpl.java index 448d817748c7b7b88f86120113da1d35358498ad..3c50042df24d9ece7ac11ea4203536fd831f6c40 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/service/impl/SeataProductServiceImpl.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/service/impl/SeataProductServiceImpl.java @@ -13,7 +13,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.math.BigDecimal; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/resources/application.yml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/resources/application.yml index 61b1ba47af10778c6ece166f7c4c402d35a83d85..1bae316699a0682b72f246e1a9da664074f9bab2 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/resources/application.yml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/resources/application.yml @@ -1,6 +1,15 @@ server: port: 5003 spring: + data: + redis: + ##redis 单机环境配置 + host: localhost + port: 6379 + database: 0 + password: + ssl: + enabled: false application: name: seata-product main: @@ -13,6 +22,11 @@ spring: username: root password: root schema: classpath:sql/schema-product.sql + cloud: + nacos: + config: + import-check: + enabled: false seata: # enable-auto-data-source-proxy: false service: diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/pom.xml index 74c7835475284afdac72164f5118752cbd400365..3d56ebba2483454ac51224e863295638fabd5893 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-test org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 jeecg-cloud-test-seata @@ -18,12 +18,12 @@ org.jeecgframework.boot - jeecg-boot-starter-cloud + jeecg-boot-starter3-cloud ${jeecgboot.version} org.jeecgframework.boot - jeecg-boot-starter-seata + jeecg-boot-starter3-seata ${jeecgboot.version} diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml index 2e574380b03d2c13e7375902298c5ca08c46a923..ca789f09e5be72efeeb478d70faca09acea27324 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml @@ -5,7 +5,7 @@ jeecg-cloud-test org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 @@ -14,7 +14,7 @@ org.jeecgframework.boot - jeecg-boot-starter-shardingsphere + jeecg-boot-starter3-shardingsphere diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml index 60882d86cc35193ad1c02edf0dd5bc97ef0286df..53be85b566bd409c7f6ba3d17c73e87c0a2be324 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml @@ -5,7 +5,7 @@ jeecg-visual org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/Dockerfile b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/Dockerfile index aaa7df803c72f06ebb58022b81fff613336744aa..a97fdbcbf198063330ae33f7a4503d87a792ef37 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/Dockerfile +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/Dockerfile @@ -10,7 +10,7 @@ WORKDIR /jeecg-cloud-xxljob EXPOSE 9080 -ADD ./target/jeecg-cloud-xxljob-3.8.0.jar ./ +ADD ./target/jeecg-cloud-xxljob-3.8.1.jar ./ -CMD java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-xxljob-3.8.0.jar +CMD java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-xxljob-3.8.1.jar diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/pom.xml b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/pom.xml index 79171e4663023bf0d40389023ee5ef562b4030a4..f0b21a6d11d64f0629526a85ac844b542baec20a 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/pom.xml +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/pom.xml @@ -5,7 +5,7 @@ jeecg-visual org.jeecgframework.boot - 3.8.0 + 3.8.1 4.0.0 diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/IndexController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/IndexController.java index eb63f0bd486c069bd0ad0a648546c313df5a5903..1a3ac53632870554e09d4f9ad2ccaa76797c3fd7 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -15,9 +15,9 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.RedirectView; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobApiController.java index aa51e7390700fadfa958f1d3b05609e76c7cd9d5..d650913fee3fdcfa07c11f389f1e77c322c9d541 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobApiController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobApiController.java @@ -14,8 +14,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobCodeController.java index fe4a0e848408e70e04278a5f907b2e202c502d2d..27c88309130f7d4e08b3d1afad27c92f9bd6c129 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobCodeController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobCodeController.java @@ -12,8 +12,8 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import java.util.Date; import java.util.List; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 8e0c5a4d56642d55901c148ce9f2a0f6e14e1254..1dedad383f4a33f8f73e185e61927db90d96c6da 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -15,8 +15,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import java.util.*; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index 516dce4188244cf2ac72b566603d96a3b6747045..f5cf653c0f23458dba192fb61e1aa89279c034fd 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -16,6 +16,8 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.util.DateUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -24,8 +26,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.util.*; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobLogController.java index bff91989e3e020ae551604e2c7996d89cea1a12a..8c4e9d85b8ec343947096daae4a6ece7ba9b772b 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -26,8 +26,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.util.HtmlUtils; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import java.util.Date; import java.util.HashMap; import java.util.List; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/UserController.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/UserController.java index 3f4c7559b576e83f5b654844bbf498a7eaaa8bc6..13b999c77c75b831171acbb8e9a22803c14030cc 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/UserController.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/UserController.java @@ -16,8 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java index 592d496133b3211bb21815797ea435f053f6a543..a6ab5ea86fbae6b803057fe72dc3463f4ac004e3 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java @@ -2,15 +2,16 @@ package com.xxl.job.admin.controller.interceptor; import com.xxl.job.admin.core.util.FtlUtil; import com.xxl.job.admin.core.util.I18nUtil; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.AsyncHandlerInterceptor; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.util.HashMap; + /** * push cookies to model as cookieMap * @@ -21,7 +22,7 @@ public class CookieInterceptor implements AsyncHandlerInterceptor { @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, - ModelAndView modelAndView) throws Exception { + ModelAndView modelAndView) throws Exception { // cookie if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) { diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index 840f0ebcf200c5798da599d8aec36c3e04d0b56f..039addc5430d97e10932ef7d492e20c30eecfc06 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -4,13 +4,14 @@ import com.xxl.job.admin.controller.annotation.PermissionLimit; import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.service.LoginService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.AsyncHandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; /** * 权限拦截 @@ -55,5 +56,23 @@ public class PermissionInterceptor implements AsyncHandlerInterceptor { return true; // proceed with the next interceptor } - + + /** + + * @param request request + * @param response response + * @param handler handler + * @param modelAndView modelAndView + * @throws Exception + */ + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + // 此处数据是preHandle方法set的loginUser信息 + Object loginIdentityKey = request.getAttribute("XXL_JOB_LOGIN_IDENTITY"); + if (null != modelAndView && null != loginIdentityKey) { + modelAndView.addObject("XXL_JOB_LOGIN_IDENTITY", loginIdentityKey); + } + } + + } diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java index 0be6ba663129d3b6939a6acafd2e1e0831fc234a..9ac56c90aff558c096bf709b2625a4c02df7b4f3 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java @@ -4,7 +4,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** * web mvc config diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java index 114407b667512151fd233d0fb9eb39b0c95ea945..53d0325c4ae5a3958ab8771d844dbcddcbf00b56 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java @@ -11,8 +11,8 @@ import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java index 16e5218489db5d2e9e0c4f4eef998f6473a009f1..2610c659396dc0040075a71a0a4614b0a02d3657 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java @@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Component; -import javax.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMessage; import java.text.MessageFormat; import java.util.Arrays; import java.util.HashSet; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java index 380b8a596b178517671f15015bee0abbbfbd4615..cde335fadd578919ae991331ef70ac78788ba169 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java @@ -9,7 +9,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Component; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.sql.DataSource; import java.util.Arrays; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java index a1523aa47e84958738845507582cb208ed489efd..cddb27fd15aa077887333022831372ca37c42214 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java @@ -1,8 +1,8 @@ package com.xxl.job.admin.core.util; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * Cookie.Util diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/LoginService.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/LoginService.java index e1cf2e44ed514ba4dc3004a88b267d61bf6a3e64..fe157995e84e7141e739c1a01b85dd83cf99a838 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/LoginService.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/LoginService.java @@ -9,9 +9,9 @@ import com.xxl.job.core.biz.model.ReturnT; import org.springframework.context.annotation.Configuration; import org.springframework.util.DigestUtils; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.math.BigInteger; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java index 3c01e94dc8ba3ad0dedc2ca9202bb063cfa1a850..a0c432c03afa1f0337c03641a0a411b8d003a601 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java @@ -8,6 +8,9 @@ import com.xxl.job.core.biz.model.RegistryParam; import com.xxl.job.core.biz.model.ReturnT; import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import java.text.MessageFormat; +import java.util.Date; import java.util.List; /** diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index b7d968843f50477ad73dcad857a5f5b4cbc29d59..f2647983491ec7a588f5cd83fac68aa1a5a60676 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -22,7 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.text.MessageFormat; import java.util.*; diff --git a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/common/common.macro.ftl b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/common/common.macro.ftl index aace849f91109cd8b57a0f586b64f1ef31c75af5..3a8b85d8668b7aecdbefabcfc2539ed1987ba617 100644 --- a/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/common/common.macro.ftl +++ b/jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/common/common.macro.ftl @@ -84,7 +84,7 @@ <#-- login user -->