Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
bf7c22e0
Unverified
提交
bf7c22e0
authored
1月 19, 2023
作者:
芋道源码
提交者:
Gitee
1月 19, 2023
浏览文件
操作
浏览文件
下载
差异文件
!17 重构 滑块验证码实现
Merge pull request !17 from xingyu/master
上级
6aaceb27
4347bc79
隐藏空白字符变更
内嵌
并排
正在显示
28 个修改的文件
包含
385 行增加
和
178 行删除
+385
-178
README.md
README.md
+7
-7
pom.xml
pom.xml
+9
-2
pom.xml
yudao-dependencies/pom.xml
+26
-19
pom.xml
yudao-framework/yudao-common/pom.xml
+5
-0
pom.xml
yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
+1
-1
pom.xml
yudao-framework/yudao-spring-boot-starter-captcha/pom.xml
+5
-5
YudaoCaptchaConfiguration.java
...o/framework/captcha/config/YudaoCaptchaConfiguration.java
+1
-1
CaptchaRedisKeyConstants.java
...ramework/captcha/core/enums/CaptchaRedisKeyConstants.java
+1
-1
RedisCaptchaServiceImpl.java
...amework/captcha/core/service/RedisCaptchaServiceImpl.java
+1
-2
com.xingyuv.captcha.service.CaptchaCacheService
.../services/com.xingyuv.captcha.service.CaptchaCacheService
+0
-0
spring.factories
...rter-captcha/src/main/resources/META-INF/spring.factories
+0
-2
org.springframework.boot.autoconfigure.AutoConfiguration.imports
...ingframework.boot.autoconfigure.AutoConfiguration.imports
+2
-0
BaseMapperX.java
...oder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
+14
-0
pom.xml
yudao-framework/yudao-spring-boot-starter-web/pom.xml
+1
-1
YudaoSwaggerAutoConfiguration.java
...amework/swagger/config/YudaoSwaggerAutoConfiguration.java
+18
-12
YudaoWebAutoConfiguration.java
...yudao/framework/web/config/YudaoWebAutoConfiguration.java
+37
-3
JsoupXssCleaner.java
...coder/yudao/framework/web/core/clean/JsoupXssCleaner.java
+80
-0
XssCleaner.java
...cn/iocoder/yudao/framework/web/core/clean/XssCleaner.java
+15
-0
XssFilter.java
...cn/iocoder/yudao/framework/web/core/filter/XssFilter.java
+5
-2
XssRequestWrapper.java
...er/yudao/framework/web/core/filter/XssRequestWrapper.java
+50
-95
XssStringJsonDeserializer.java
...ao/framework/web/core/json/XssStringJsonDeserializer.java
+59
-0
pom.xml
yudao-gateway/pom.xml
+1
-1
CodegenConvert.java
...er/yudao/module/infra/convert/codegen/CodegenConvert.java
+8
-1
CodegenColumnDO.java
.../module/infra/dal/dataobject/codegen/CodegenColumnDO.java
+8
-6
DefaultDatabaseQueryTest.java
.../yudao/module/infra/service/DefaultDatabaseQueryTest.java
+2
-2
CaptchaController.java
...le/system/controller/admin/captcha/CaptchaController.java
+25
-11
AdminAuthServiceImpl.java
...udao/module/system/service/auth/AdminAuthServiceImpl.java
+3
-3
AdminAuthServiceImplTest.java
.../module/system/service/auth/AdminAuthServiceImplTest.java
+1
-1
没有找到文件。
README.md
浏览文件 @
bf7c22e0
...
@@ -213,7 +213,7 @@ ps:核心功能已经实现,正在对接微信小程序中...
...
@@ -213,7 +213,7 @@ ps:核心功能已经实现,正在对接微信小程序中...
|
[
Seata
](
https://github.com/seata/seata
)
| 分布式事务 | 1.6.1 |
[
文档
](
https://www.iocoder.cn/categories/Seata/?yudao
)
|
|
[
Seata
](
https://github.com/seata/seata
)
| 分布式事务 | 1.6.1 |
[
文档
](
https://www.iocoder.cn/categories/Seata/?yudao
)
|
|
[
MySQL
](
https://www.mysql.com/cn/
)
| 数据库服务器 | 5.7 / 8.0+ | |
|
[
MySQL
](
https://www.mysql.com/cn/
)
| 数据库服务器 | 5.7 / 8.0+ | |
|
[
Druid
](
https://github.com/alibaba/druid
)
| JDBC 连接池、监控组件 | 1.2.15 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao
)
|
|
[
Druid
](
https://github.com/alibaba/druid
)
| JDBC 连接池、监控组件 | 1.2.15 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao
)
|
|
[
MyBatis Plus
](
https://mp.baomidou.com/
)
| MyBatis 增强工具包 | 3.5.
2
|
[
文档
](
http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao
)
|
|
[
MyBatis Plus
](
https://mp.baomidou.com/
)
| MyBatis 增强工具包 | 3.5.
3.1
|
[
文档
](
http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao
)
|
|
[
Dynamic Datasource
](
https://dynamic-datasource.com/
)
| 动态数据源 | 3.6.0 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao
)
|
|
[
Dynamic Datasource
](
https://dynamic-datasource.com/
)
| 动态数据源 | 3.6.0 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao
)
|
|
[
Redis
](
https://redis.io/
)
| key-value 数据库 | 5.0 / 6.0 | |
|
[
Redis
](
https://redis.io/
)
| key-value 数据库 | 5.0 / 6.0 | |
|
[
Redisson
](
https://github.com/redisson/redisson
)
| Redis 客户端 | 3.18.0 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Redis/?yudao
)
|
|
[
Redisson
](
https://github.com/redisson/redisson
)
| Redis 客户端 | 3.18.0 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Redis/?yudao
)
|
...
@@ -221,9 +221,9 @@ ps:核心功能已经实现,正在对接微信小程序中...
...
@@ -221,9 +221,9 @@ ps:核心功能已经实现,正在对接微信小程序中...
|
[
Spring Security
](
https://github.com/spring-projects/spring-security
)
| Spring 安全框架 | 5.7.5 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao
)
|
|
[
Spring Security
](
https://github.com/spring-projects/spring-security
)
| Spring 安全框架 | 5.7.5 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao
)
|
|
[
Hibernate Validator
](
https://github.com/hibernate/hibernate-validator
)
| 参数校验组件 | 6.2.5 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Validation/?yudao
)
|
|
[
Hibernate Validator
](
https://github.com/hibernate/hibernate-validator
)
| 参数校验组件 | 6.2.5 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Validation/?yudao
)
|
|
[
Flowable
](
https://github.com/flowable/flowable-engine
)
| 工作流引擎 | 6.7.2 |
[
文档
](
https://doc.iocoder.cn/bpm/
)
|
|
[
Flowable
](
https://github.com/flowable/flowable-engine
)
| 工作流引擎 | 6.7.2 |
[
文档
](
https://doc.iocoder.cn/bpm/
)
|
|
[
Knife4j
](
https://gitee.com/xiaoym/knife4j
)
| Swagger 增强 UI 实现 |
3.0.3
|
[
文档
](
http://www.iocoder.cn/Spring-Boot/Swagger/?yudao
)
|
|
[
Knife4j
](
https://gitee.com/xiaoym/knife4j
)
| Swagger 增强 UI 实现 |
4.0.0
|
[
文档
](
http://www.iocoder.cn/Spring-Boot/Swagger/?yudao
)
|
|
[
SkyWalking
](
https://skywalking.apache.org/
)
| 分布式应用追踪系统 | 8.12.0 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao
)
|
|
[
SkyWalking
](
https://skywalking.apache.org/
)
| 分布式应用追踪系统 | 8.12.0 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao
)
|
|
[
Spring Boot Admin
](
https://github.com/codecentric/spring-boot-admin
)
| Spring Boot 监控平台 | 2.7.
9
|
[
文档
](
http://www.iocoder.cn/Spring-Boot/Admin/?yudao
)
|
|
[
Spring Boot Admin
](
https://github.com/codecentric/spring-boot-admin
)
| Spring Boot 监控平台 | 2.7.
10
|
[
文档
](
http://www.iocoder.cn/Spring-Boot/Admin/?yudao
)
|
|
[
Jackson
](
https://github.com/FasterXML/jackson
)
| JSON 工具库 | 2.13.3 | |
|
[
Jackson
](
https://github.com/FasterXML/jackson
)
| JSON 工具库 | 2.13.3 | |
|
[
MapStruct
](
https://mapstruct.org/
)
| Java Bean 转换 | 1.5.3.Final |
[
文档
](
http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao
)
|
|
[
MapStruct
](
https://mapstruct.org/
)
| Java Bean 转换 | 1.5.3.Final |
[
文档
](
http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao
)
|
|
[
Lombok
](
https://projectlombok.org/
)
| 消除冗长的 Java 代码 | 1.18.24 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Lombok/?yudao
)
|
|
[
Lombok
](
https://projectlombok.org/
)
| 消除冗长的 Java 代码 | 1.18.24 |
[
文档
](
http://www.iocoder.cn/Spring-Boot/Lombok/?yudao
)
|
...
@@ -242,12 +242,12 @@ ps:核心功能已经实现,正在对接微信小程序中...
...
@@ -242,12 +242,12 @@ ps:核心功能已经实现,正在对接微信小程序中...
| 框架 | 说明 | 版本 |
| 框架 | 说明 | 版本 |
|----------------------------------------------------------------------|:------------:|:------:|
|----------------------------------------------------------------------|:------------:|:------:|
|
[
Vue
](
https://staging-cn.vuejs.org/
)
| Vue 框架 | 3.2.45 |
|
[
Vue
](
https://staging-cn.vuejs.org/
)
| Vue 框架 | 3.2.45 |
|
[
Vite
](
https://cn.vitejs.dev//
)
| 开发与构建工具 | 4.0.
3
|
|
[
Vite
](
https://cn.vitejs.dev//
)
| 开发与构建工具 | 4.0.
4
|
|
[
Element Plus
](
https://element-plus.org/zh-CN/
)
| Element Plus | 2.2.2
7
|
|
[
Element Plus
](
https://element-plus.org/zh-CN/
)
| Element Plus | 2.2.2
8
|
|
[
TypeScript
](
https://www.typescriptlang.org/docs/
)
| TypeScript | 4.9.4 |
|
[
TypeScript
](
https://www.typescriptlang.org/docs/
)
| TypeScript | 4.9.4 |
|
[
pinia
](
https://pinia.vuejs.org/
)
| vuex5 | 2.0.2
8
|
|
[
pinia
](
https://pinia.vuejs.org/
)
| vuex5 | 2.0.2
9
|
|
[
vue-i18n
](
https://kazupon.github.io/vue-i18n/zh/introduction.html/
)
| 国际化 | 9.2.2 |
|
[
vue-i18n
](
https://kazupon.github.io/vue-i18n/zh/introduction.html/
)
| 国际化 | 9.2.2 |
|
[
vxe-table
](
https://vxetable.cn/
)
| vue最强表单 | 4.3.
7
|
|
[
vxe-table
](
https://vxetable.cn/
)
| vue最强表单 | 4.3.
9
|
### [管理后台 uni-app 跨端](./yudao-ui-admin-uniapp)
### [管理后台 uni-app 跨端](./yudao-ui-admin-uniapp)
...
...
pom.xml
浏览文件 @
bf7c22e0
...
@@ -24,15 +24,16 @@
...
@@ -24,15 +24,16 @@
<url>
https://github.com/YunaiV/ruoyi-vue-pro
</url>
<url>
https://github.com/YunaiV/ruoyi-vue-pro
</url>
<properties>
<properties>
<revision>
1.6.
5
-snapshot
</revision>
<revision>
1.6.
6
-snapshot
</revision>
<!-- Maven 相关 -->
<!-- Maven 相关 -->
<java.version>
1.8
</java.version>
<java.version>
1.8
</java.version>
<maven.compiler.source>
${java.version}
</maven.compiler.source>
<maven.compiler.source>
${java.version}
</maven.compiler.source>
<maven.compiler.target>
${java.version}
</maven.compiler.target>
<maven.compiler.target>
${java.version}
</maven.compiler.target>
<maven-surefire-plugin.version>
3.0.0-M5
</maven-surefire-plugin.version>
<maven-surefire-plugin.version>
3.0.0-M5
</maven-surefire-plugin.version>
<maven-compiler-plugin.version>
3.8.
0
</maven-compiler-plugin.version>
<maven-compiler-plugin.version>
3.8.
1
</maven-compiler-plugin.version>
<!-- 看看咋放到 bom 里 -->
<!-- 看看咋放到 bom 里 -->
<lombok.version>
1.18.24
</lombok.version>
<lombok.version>
1.18.24
</lombok.version>
<spring.boot.version>
2.7.7
</spring.boot.version>
<mapstruct.version>
1.5.3.Final
</mapstruct.version>
<mapstruct.version>
1.5.3.Final
</mapstruct.version>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
</properties>
</properties>
...
@@ -60,12 +61,18 @@
...
@@ -60,12 +61,18 @@
<version>
${maven-surefire-plugin.version}
</version>
<version>
${maven-surefire-plugin.version}
</version>
</plugin>
</plugin>
<!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 -->
<!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 -->
<!-- https://stackoverflow.com/questions/33483697/re-run-spring-boot-configuration-annotation-processor-to-update-generated-metada -->
<plugin>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-compiler-plugin
</artifactId>
<artifactId>
maven-compiler-plugin
</artifactId>
<version>
${maven-compiler-plugin.version}
</version>
<version>
${maven-compiler-plugin.version}
</version>
<configuration>
<configuration>
<annotationProcessorPaths>
<annotationProcessorPaths>
<path>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
<version>
${spring.boot.version}
</version>
</path>
<path>
<path>
<groupId>
org.projectlombok
</groupId>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
<artifactId>
lombok
</artifactId>
...
...
yudao-dependencies/pom.xml
浏览文件 @
bf7c22e0
...
@@ -14,23 +14,23 @@
...
@@ -14,23 +14,23 @@
<url>
https://github.com/YunaiV/ruoyi-vue-pro
</url>
<url>
https://github.com/YunaiV/ruoyi-vue-pro
</url>
<properties>
<properties>
<revision>
1.6.
5
-snapshot
</revision>
<revision>
1.6.
6
-snapshot
</revision>
<!-- 统一依赖管理 -->
<!-- 统一依赖管理 -->
<spring.boot.version>
2.7.7
</spring.boot.version>
<spring.boot.version>
2.7.7
</spring.boot.version>
<spring.cloud.version>
2021.0.5
</spring.cloud.version>
<spring.cloud.version>
2021.0.5
</spring.cloud.version>
<spring.cloud.alibaba.version>
2021.0.4.0
</spring.cloud.alibaba.version>
<spring.cloud.alibaba.version>
2021.0.4.0
</spring.cloud.alibaba.version>
<!-- Web 相关 -->
<!-- Web 相关 -->
<knife4j.version>
3.0.3
</knife4j.version>
<knife4j.version>
4.0.0
</knife4j.version>
<swagger-annotations.version>
1.6.8
</swagger-annotations.version>
<swagger-annotations.version>
1.6.8
</swagger-annotations.version>
<servlet.versoin>
2.5
</servlet.versoin>
<servlet.versoin>
2.5
</servlet.versoin>
<!-- DB 相关 -->
<!-- DB 相关 -->
<druid.version>
1.2.15
</druid.version>
<druid.version>
1.2.15
</druid.version>
<mybatis-plus.version>
3.5.3
</mybatis-plus.version>
<mybatis-plus.version>
3.5.3
.1
</mybatis-plus.version>
<mybatis-plus-generator.version>
3.5.
2
</mybatis-plus-generator.version>
<mybatis-plus-generator.version>
3.5.
3.1
</mybatis-plus-generator.version>
<dynamic-datasource.version>
3.6.1
</dynamic-datasource.version>
<dynamic-datasource.version>
3.6.1
</dynamic-datasource.version>
<redisson.version>
3.18.0
</redisson.version>
<redisson.version>
3.18.0
</redisson.version>
<!-- RPC 相关 -->
<!-- RPC 相关 -->
<dubbo.version>
2.7.1
5
</dubbo.version>
<dubbo.version>
2.7.1
8
</dubbo.version>
<!-- Config 配置中心相关 -->
<!-- Config 配置中心相关 -->
<apollo.version>
1.9.2
</apollo.version>
<apollo.version>
1.9.2
</apollo.version>
<!-- Job 定时任务相关 -->
<!-- Job 定时任务相关 -->
...
@@ -40,19 +40,21 @@
...
@@ -40,19 +40,21 @@
<resilience4j.version>
1.7.1
</resilience4j.version>
<resilience4j.version>
1.7.1
</resilience4j.version>
<!-- 监控相关 -->
<!-- 监控相关 -->
<skywalking.version>
8.12.0
</skywalking.version>
<skywalking.version>
8.12.0
</skywalking.version>
<spring-boot-admin.version>
2.7.
9
</spring-boot-admin.version>
<spring-boot-admin.version>
2.7.
10
</spring-boot-admin.version>
<opentracing.version>
0.33.0
</opentracing.version>
<opentracing.version>
0.33.0
</opentracing.version>
<!-- Test 测试相关 -->
<!-- Test 测试相关 -->
<podam.version>
7.2.11.RELEASE
</podam.version>
<podam.version>
7.2.11.RELEASE
</podam.version>
<jedis-mock.version>
1.0.5
</jedis-mock.version>
<jedis-mock.version>
1.0.5
</jedis-mock.version>
<mockito-inline.version>
4.
8
.0
</mockito-inline.version>
<mockito-inline.version>
4.
11
.0
</mockito-inline.version>
<!-- Bpm 工作流相关 -->
<!-- Bpm 工作流相关 -->
<flowable.version>
6.8.0
</flowable.version>
<flowable.version>
6.8.0
</flowable.version>
<!-- 工具类相关 -->
<!-- 工具类相关 -->
<captcha-plus.version>
1.0.1
</captcha-plus.version>
<jsoup.version>
1.15.3
</jsoup.version>
<lombok.version>
1.18.24
</lombok.version>
<lombok.version>
1.18.24
</lombok.version>
<mapstruct.version>
1.5.3.Final
</mapstruct.version>
<mapstruct.version>
1.5.3.Final
</mapstruct.version>
<hutool.version>
5.8.11
</hutool.version>
<hutool.version>
5.8.11
</hutool.version>
<easyexcel.verion>
3.1.
3
</easyexcel.verion>
<easyexcel.verion>
3.1.
5
</easyexcel.verion>
<velocity.version>
2.3
</velocity.version>
<velocity.version>
2.3
</velocity.version>
<screw.version>
1.0.5
</screw.version>
<screw.version>
1.0.5
</screw.version>
<fastjson.version>
1.2.83
</fastjson.version>
<fastjson.version>
1.2.83
</fastjson.version>
...
@@ -61,17 +63,16 @@
...
@@ -61,17 +63,16 @@
<transmittable-thread-local.version>
2.14.2
</transmittable-thread-local.version>
<transmittable-thread-local.version>
2.14.2
</transmittable-thread-local.version>
<commons-net.version>
3.8.0
</commons-net.version>
<commons-net.version>
3.8.0
</commons-net.version>
<jsch.version>
0.1.55
</jsch.version>
<jsch.version>
0.1.55
</jsch.version>
<tika-core.version>
2.5.0
</tika-core.version>
<tika-core.version>
2.6.0
</tika-core.version>
<aj-captcha.version>
1.3.0
</aj-captcha.version>
<netty-all.version>
4.1.86.Final
</netty-all.version>
<netty-all.version>
4.1.86.Final
</netty-all.version>
<ip2region.version>
2.6.6
</ip2region.version>
<ip2region.version>
2.6.6
</ip2region.version>
<!-- 三方云服务相关 -->
<!-- 三方云服务相关 -->
<okio.version>
3.0.0
</okio.version>
<okio.version>
3.0.0
</okio.version>
<okhttp3.version>
4.10.0
</okhttp3.version>
<okhttp3.version>
4.10.0
</okhttp3.version>
<minio.version>
8.
4.6
</minio.version>
<minio.version>
8.
5.1
</minio.version>
<aliyun-java-sdk-core.version>
4.6.3
</aliyun-java-sdk-core.version>
<aliyun-java-sdk-core.version>
4.6.3
</aliyun-java-sdk-core.version>
<aliyun-java-sdk-dysmsapi.version>
2.2.1
</aliyun-java-sdk-dysmsapi.version>
<aliyun-java-sdk-dysmsapi.version>
2.2.1
</aliyun-java-sdk-dysmsapi.version>
<tencentcloud-sdk-java.version>
3.1.6
60
</tencentcloud-sdk-java.version>
<tencentcloud-sdk-java.version>
3.1.6
76
</tencentcloud-sdk-java.version>
<justauth.version>
1.4.0
</justauth.version>
<justauth.version>
1.4.0
</justauth.version>
</properties>
</properties>
...
@@ -191,7 +192,7 @@
...
@@ -191,7 +192,7 @@
<dependency>
<dependency>
<groupId>
com.github.xiaoymin
</groupId>
<groupId>
com.github.xiaoymin
</groupId>
<artifactId>
knife4j-spring-boot-starter
</artifactId>
<artifactId>
knife4j-
openapi2-
spring-boot-starter
</artifactId>
<version>
${knife4j.version}
</version>
<version>
${knife4j.version}
</version>
<exclusions>
<exclusions>
<exclusion>
<exclusion>
...
@@ -501,12 +502,6 @@
...
@@ -501,12 +502,6 @@
<version>
${tika-core.version}
</version>
<version>
${tika-core.version}
</version>
</dependency>
</dependency>
<dependency>
<groupId>
com.anji-plus
</groupId>
<artifactId>
spring-boot-starter-captcha
</artifactId>
<version>
${aj-captcha.version}
</version>
</dependency>
<dependency>
<dependency>
<groupId>
org.apache.velocity
</groupId>
<groupId>
org.apache.velocity
</groupId>
<artifactId>
velocity-engine-core
</artifactId>
<artifactId>
velocity-engine-core
</artifactId>
...
@@ -570,12 +565,24 @@
...
@@ -570,12 +565,24 @@
<version>
${netty-all.version}
</version>
<version>
${netty-all.version}
</version>
</dependency>
</dependency>
<dependency>
<groupId>
com.xingyuv
</groupId>
<artifactId>
spring-boot-starter-captcha-plus
</artifactId>
<version>
${captcha-plus.version}
</version>
</dependency>
<dependency>
<dependency>
<groupId>
org.lionsoul
</groupId>
<groupId>
org.lionsoul
</groupId>
<artifactId>
ip2region
</artifactId>
<artifactId>
ip2region
</artifactId>
<version>
${ip2region.version}
</version>
<version>
${ip2region.version}
</version>
</dependency>
</dependency>
<dependency>
<groupId>
org.jsoup
</groupId>
<artifactId>
jsoup
</artifactId>
<version>
${jsoup.version}
</version>
</dependency>
<!-- 三方云服务相关 -->
<!-- 三方云服务相关 -->
<dependency>
<dependency>
<groupId>
com.squareup.okio
</groupId>
<groupId>
com.squareup.okio
</groupId>
...
...
yudao-framework/yudao-common/pom.xml
浏览文件 @
bf7c22e0
...
@@ -133,6 +133,11 @@
...
@@ -133,6 +133,11 @@
<artifactId>
transmittable-thread-local
</artifactId>
<artifactId>
transmittable-thread-local
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.jsoup
</groupId>
<artifactId>
jsoup
</artifactId>
</dependency>
</dependencies>
</dependencies>
</project>
</project>
yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml
浏览文件 @
bf7c22e0
...
@@ -52,7 +52,7 @@
...
@@ -52,7 +52,7 @@
<dependency>
<dependency>
<groupId>
com.alipay.sdk
</groupId>
<groupId>
com.alipay.sdk
</groupId>
<artifactId>
alipay-sdk-java
</artifactId>
<artifactId>
alipay-sdk-java
</artifactId>
<version>
4.3
1.7
2.ALL
</version>
<version>
4.3
5.3
2.ALL
</version>
<exclusions>
<exclusions>
<exclusion>
<exclusion>
<groupId>
org.bouncycastle
</groupId>
<groupId>
org.bouncycastle
</groupId>
...
...
yudao-framework/yudao-spring-boot-starter-captcha/pom.xml
浏览文件 @
bf7c22e0
...
@@ -17,6 +17,11 @@
...
@@ -17,6 +17,11 @@
</description>
</description>
<dependencies>
<dependencies>
<!-- Spring 核心 -->
<dependency>
<groupId>
com.xingyuv
</groupId>
<artifactId>
spring-boot-starter-captcha-plus
</artifactId>
</dependency>
<!-- Spring 核心 -->
<!-- Spring 核心 -->
<dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
...
@@ -29,11 +34,6 @@
...
@@ -29,11 +34,6 @@
<artifactId>
yudao-spring-boot-starter-redis
</artifactId>
<artifactId>
yudao-spring-boot-starter-redis
</artifactId>
</dependency>
</dependency>
<!-- 验证码相关 -->
<dependency>
<groupId>
com.anji-plus
</groupId>
<artifactId>
spring-boot-starter-captcha
</artifactId>
</dependency>
</dependencies>
</dependencies>
</project>
</project>
yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/config/YudaoCaptchaConfiguration.java
浏览文件 @
bf7c22e0
...
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.captcha.config;
...
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.captcha.config;
import
cn.hutool.core.util.ClassUtil
;
import
cn.hutool.core.util.ClassUtil
;
import
cn.iocoder.yudao.framework.captcha.core.enums.CaptchaRedisKeyConstants
;
import
cn.iocoder.yudao.framework.captcha.core.enums.CaptchaRedisKeyConstants
;
import
cn.iocoder.yudao.framework.captcha.core.service.RedisCaptchaServiceImpl
;
import
cn.iocoder.yudao.framework.captcha.core.service.RedisCaptchaServiceImpl
;
import
com.
anji
.captcha.service.CaptchaCacheService
;
import
com.
xingyuv
.captcha.service.CaptchaCacheService
;
import
org.springframework.boot.autoconfigure.AutoConfiguration
;
import
org.springframework.boot.autoconfigure.AutoConfiguration
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
...
...
yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/enums/CaptchaRedisKeyConstants.java
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
framework
.
captcha
.
core
.
enums
;
package
cn
.
iocoder
.
yudao
.
framework
.
captcha
.
core
.
enums
;
import
cn.iocoder.yudao.framework.redis.core.RedisKeyDefine
;
import
cn.iocoder.yudao.framework.redis.core.RedisKeyDefine
;
import
com.
anji
.captcha.model.vo.PointVO
;
import
com.
xingyuv
.captcha.model.vo.PointVO
;
import
java.time.Duration
;
import
java.time.Duration
;
...
...
yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/cn/iocoder/yudao/framework/captcha/core/service/RedisCaptchaServiceImpl.java
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
framework
.
captcha
.
core
.
service
;
package
cn
.
iocoder
.
yudao
.
framework
.
captcha
.
core
.
service
;
import
com.
anji
.captcha.service.CaptchaCacheService
;
import
com.
xingyuv
.captcha.service.CaptchaCacheService
;
import
lombok.AllArgsConstructor
;
import
lombok.AllArgsConstructor
;
import
lombok.NoArgsConstructor
;
import
lombok.NoArgsConstructor
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
...
...
yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.
anji
.captcha.service.CaptchaCacheService
→
yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/services/com.
xingyuv
.captcha.service.CaptchaCacheService
浏览文件 @
bf7c22e0
File moved
yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/spring.factories
deleted
100644 → 0
浏览文件 @
6aaceb27
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.iocoder.yudao.framework.captcha.config.YudaoCaptchaConfiguration
yudao-framework/yudao-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
0 → 100644
浏览文件 @
bf7c22e0
cn.iocoder.yudao.framework.captcha.config.YudaoCaptchaConfiguration
\ No newline at end of file
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
浏览文件 @
bf7c22e0
...
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
...
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.toolkit.support.SFunction
;
import
com.baomidou.mybatisplus.core.toolkit.support.SFunction
;
import
com.baomidou.mybatisplus.extension.toolkit.Db
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.Collection
;
import
java.util.Collection
;
...
@@ -87,8 +88,21 @@ public interface BaseMapperX<T> extends BaseMapper<T> {
...
@@ -87,8 +88,21 @@ public interface BaseMapperX<T> extends BaseMapper<T> {
entities
.
forEach
(
this
::
insert
);
entities
.
forEach
(
this
::
insert
);
}
}
/**
* 批量插入,适合大量数据插入
*
* @param entities 实体们
* @param size 插入数量 Db.saveBatch 默认为1000
*/
default
void
insertBatch
(
Collection
<
T
>
entities
,
int
size
)
{
Db
.
saveBatch
(
entities
,
size
);
}
default
void
updateBatch
(
T
update
)
{
default
void
updateBatch
(
T
update
)
{
update
(
update
,
new
QueryWrapper
<>());
update
(
update
,
new
QueryWrapper
<>());
}
}
default
void
updateBatch
(
Collection
<
T
>
entities
,
int
size
)
{
Db
.
updateBatchById
(
entities
,
size
);
}
}
}
yudao-framework/yudao-spring-boot-starter-web/pom.xml
浏览文件 @
bf7c22e0
...
@@ -35,7 +35,7 @@
...
@@ -35,7 +35,7 @@
<dependency>
<dependency>
<groupId>
com.github.xiaoymin
</groupId>
<groupId>
com.github.xiaoymin
</groupId>
<artifactId>
knife4j-spring-boot-starter
</artifactId>
<artifactId>
knife4j-
openapi2-
spring-boot-starter
</artifactId>
</dependency>
</dependency>
<dependency>
<dependency>
<groupId>
io.swagger
</groupId>
<groupId>
io.swagger
</groupId>
...
...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java
浏览文件 @
bf7c22e0
...
@@ -7,18 +7,18 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
...
@@ -7,18 +7,18 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.HttpHeaders
;
import
springfox.documentation.builders.ApiInfoBuilder
;
import
springfox.documentation.builders.ApiInfoBuilder
;
import
springfox.documentation.builders.
Example
Builder
;
import
springfox.documentation.builders.
Parameter
Builder
;
import
springfox.documentation.builders.PathSelectors
;
import
springfox.documentation.builders.PathSelectors
;
import
springfox.documentation.
builders.RequestParameterBuilder
;
import
springfox.documentation.
schema.ModelRef
;
import
springfox.documentation.service.*
;
import
springfox.documentation.service.*
;
import
springfox.documentation.spi.DocumentationType
;
import
springfox.documentation.spi.DocumentationType
;
import
springfox.documentation.spi.service.contexts.SecurityContext
;
import
springfox.documentation.spi.service.contexts.SecurityContext
;
import
springfox.documentation.spring.web.plugins.Docket
;
import
springfox.documentation.spring.web.plugins.Docket
;
import
springfox.documentation.swagger2.annotations.EnableSwagger2
;
import
springfox.documentation.swagger2.annotations.EnableSwagger2
WebMvc
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.List
;
...
@@ -31,7 +31,7 @@ import static springfox.documentation.builders.RequestHandlerSelectors.basePacka
...
@@ -31,7 +31,7 @@ import static springfox.documentation.builders.RequestHandlerSelectors.basePacka
* @author 芋道源码
* @author 芋道源码
*/
*/
@AutoConfiguration
@AutoConfiguration
@EnableSwagger2
@EnableSwagger2
WebMvc
@EnableKnife4j
@EnableKnife4j
@ConditionalOnClass
({
Docket
.
class
,
ApiInfoBuilder
.
class
})
@ConditionalOnClass
({
Docket
.
class
,
ApiInfoBuilder
.
class
})
// 允许使用 swagger.enable=false 禁用 Swagger
// 允许使用 swagger.enable=false 禁用 Swagger
...
@@ -60,7 +60,7 @@ public class YudaoSwaggerAutoConfiguration {
...
@@ -60,7 +60,7 @@ public class YudaoSwaggerAutoConfiguration {
.
securitySchemes
(
securitySchemes
())
.
securitySchemes
(
securitySchemes
())
.
securityContexts
(
securityContexts
())
.
securityContexts
(
securityContexts
())
// ④ 全局参数(多租户 header)
// ④ 全局参数(多租户 header)
.
global
Request
Parameters
(
globalRequestParameters
());
.
global
Operation
Parameters
(
globalRequestParameters
());
}
}
// ========== apiInfo ==========
// ========== apiInfo ==========
...
@@ -96,7 +96,7 @@ public class YudaoSwaggerAutoConfiguration {
...
@@ -96,7 +96,7 @@ public class YudaoSwaggerAutoConfiguration {
return
Collections
.
singletonList
(
SecurityContext
.
builder
()
return
Collections
.
singletonList
(
SecurityContext
.
builder
()
.
securityReferences
(
securityReferences
())
.
securityReferences
(
securityReferences
())
// 通过 PathSelectors.regex("^(?!auth).*$"),排除包含 "auth" 的接口不需要使用securitySchemes
// 通过 PathSelectors.regex("^(?!auth).*$"),排除包含 "auth" 的接口不需要使用securitySchemes
.
operationSelector
(
o
->
o
.
requestMappingPattern
().
matches
(
"^(?!auth).*$"
))
.
forPaths
(
PathSelectors
.
regex
(
"^(?!auth).*$"
))
.
build
());
.
build
());
}
}
...
@@ -110,11 +110,17 @@ public class YudaoSwaggerAutoConfiguration {
...
@@ -110,11 +110,17 @@ public class YudaoSwaggerAutoConfiguration {
// ========== globalRequestParameters ==========
// ========== globalRequestParameters ==========
private
static
List
<
RequestParameter
>
globalRequestParameters
()
{
private
static
List
<
Parameter
>
globalRequestParameters
()
{
RequestParameterBuilder
tenantParameter
=
new
RequestParameterBuilder
()
List
<
Parameter
>
tenantParameter
=
new
ArrayList
<>();
.
name
(
HEADER_TENANT_ID
).
description
(
"租户编号"
)
tenantParameter
.
add
(
new
ParameterBuilder
()
.
in
(
ParameterType
.
HEADER
).
example
(
new
ExampleBuilder
().
value
(
1L
).
build
());
.
name
(
HEADER_TENANT_ID
)
return
Collections
.
singletonList
(
tenantParameter
.
build
());
.
description
(
"租户编号"
)
.
modelRef
(
new
ModelRef
(
"long"
))
.
defaultValue
(
"1"
)
.
parameterType
(
"header"
)
.
required
(
true
)
.
build
());
return
tenantParameter
;
}
}
}
}
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java
浏览文件 @
bf7c22e0
...
@@ -2,15 +2,22 @@ package cn.iocoder.yudao.framework.web.config;
...
@@ -2,15 +2,22 @@ package cn.iocoder.yudao.framework.web.config;
import
cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService
;
import
cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService
;
import
cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum
;
import
cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum
;
import
cn.iocoder.yudao.framework.web.core.clean.JsoupXssCleaner
;
import
cn.iocoder.yudao.framework.web.core.clean.XssCleaner
;
import
cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter
;
import
cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter
;
import
cn.iocoder.yudao.framework.web.core.filter.DemoFilter
;
import
cn.iocoder.yudao.framework.web.core.filter.DemoFilter
;
import
cn.iocoder.yudao.framework.web.core.filter.XssFilter
;
import
cn.iocoder.yudao.framework.web.core.filter.XssFilter
;
import
cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler
;
import
cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler
;
import
cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler
;
import
cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler
;
import
cn.iocoder.yudao.framework.web.core.json.XssStringJsonDeserializer
;
import
cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils
;
import
cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.AutoConfiguration
;
import
org.springframework.boot.autoconfigure.AutoConfiguration
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
...
@@ -48,7 +55,7 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
...
@@ -48,7 +55,7 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
* 设置 API 前缀,仅仅匹配 controller 包下的
* 设置 API 前缀,仅仅匹配 controller 包下的
*
*
* @param configurer 配置
* @param configurer 配置
* @param api API 配置
* @param api
API 配置
*/
*/
private
void
configurePathMatch
(
PathMatchConfigurer
configurer
,
WebProperties
.
Api
api
)
{
private
void
configurePathMatch
(
PathMatchConfigurer
configurer
,
WebProperties
.
Api
api
)
{
AntPathMatcher
antPathMatcher
=
new
AntPathMatcher
(
"."
);
AntPathMatcher
antPathMatcher
=
new
AntPathMatcher
(
"."
);
...
@@ -104,8 +111,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
...
@@ -104,8 +111,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
* 创建 XssFilter Bean,解决 Xss 安全问题
* 创建 XssFilter Bean,解决 Xss 安全问题
*/
*/
@Bean
@Bean
public
FilterRegistrationBean
<
XssFilter
>
xssFilter
(
XssProperties
properties
,
PathMatcher
mvcPathMatcher
)
{
@ConditionalOnBean
(
XssCleaner
.
class
)
return
createFilterBean
(
new
XssFilter
(
properties
,
mvcPathMatcher
),
WebFilterOrderEnum
.
XSS_FILTER
);
public
FilterRegistrationBean
<
XssFilter
>
xssFilter
(
XssProperties
properties
,
PathMatcher
pathMatcher
,
XssCleaner
xssCleaner
)
{
return
createFilterBean
(
new
XssFilter
(
properties
,
pathMatcher
,
xssCleaner
),
WebFilterOrderEnum
.
XSS_FILTER
);
}
}
/**
/**
...
@@ -117,6 +125,32 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
...
@@ -117,6 +125,32 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
return
createFilterBean
(
new
DemoFilter
(),
WebFilterOrderEnum
.
DEMO_FILTER
);
return
createFilterBean
(
new
DemoFilter
(),
WebFilterOrderEnum
.
DEMO_FILTER
);
}
}
/**
* Xss 清理者
*
* @return XssCleaner
*/
@ConditionalOnMissingBean
(
XssCleaner
.
class
)
@Bean
public
XssCleaner
xssCleaner
()
{
return
new
JsoupXssCleaner
();
}
/**
* 注册 Jackson 的序列化器,用于处理 json 类型参数的 xss 过滤
*
* @return Jackson2ObjectMapperBuilderCustomizer
*/
@Bean
@ConditionalOnMissingBean
(
name
=
"xssJacksonCustomizer"
)
@ConditionalOnBean
(
ObjectMapper
.
class
)
public
Jackson2ObjectMapperBuilderCustomizer
xssJacksonCustomizer
(
XssCleaner
xssCleaner
,
XssProperties
xssProperties
)
{
// 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理
return
builder
->
builder
.
deserializerByType
(
String
.
class
,
new
XssStringJsonDeserializer
(
xssCleaner
,
xssProperties
));
}
private
static
<
T
extends
Filter
>
FilterRegistrationBean
<
T
>
createFilterBean
(
T
filter
,
Integer
order
)
{
private
static
<
T
extends
Filter
>
FilterRegistrationBean
<
T
>
createFilterBean
(
T
filter
,
Integer
order
)
{
FilterRegistrationBean
<
T
>
bean
=
new
FilterRegistrationBean
<>(
filter
);
FilterRegistrationBean
<
T
>
bean
=
new
FilterRegistrationBean
<>(
filter
);
bean
.
setOrder
(
order
);
bean
.
setOrder
(
order
);
...
...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/clean/JsoupXssCleaner.java
0 → 100644
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
clean
;
import
org.jsoup.Jsoup
;
import
org.jsoup.nodes.Document
;
import
org.jsoup.safety.Safelist
;
/**
* jsonp 过滤字符串
*/
public
class
JsoupXssCleaner
implements
XssCleaner
{
private
final
Safelist
safelist
;
/**
* 用于在 src 属性使用相对路径时,强制转换为绝对路径。 为空时不处理,值应为绝对路径的前缀(包含协议部分)
*/
private
final
String
baseUri
;
/**
* 无参构造,默认使用 {@link JsoupXssCleaner#buildSafelist} 方法构建一个安全列表
*/
public
JsoupXssCleaner
()
{
this
.
safelist
=
buildSafelist
();
this
.
baseUri
=
""
;
}
public
JsoupXssCleaner
(
Safelist
safelist
)
{
this
.
safelist
=
safelist
;
this
.
baseUri
=
""
;
}
public
JsoupXssCleaner
(
String
baseUri
)
{
this
.
safelist
=
buildSafelist
();
this
.
baseUri
=
baseUri
;
}
public
JsoupXssCleaner
(
Safelist
safelist
,
String
baseUri
)
{
this
.
safelist
=
safelist
;
this
.
baseUri
=
baseUri
;
}
/**
* 构建一个 Xss 清理的 Safelist 规则。
* 基于 Safelist#relaxed() 的基础上:
* 1. 扩展支持了 style 和 class 属性
* 2. a 标签额外支持了 target 属性
* 3. img 标签额外支持了 data 协议,便于支持 base64
*
* @return Safelist
*/
private
Safelist
buildSafelist
()
{
// 使用 jsoup 提供的默认的
Safelist
relaxedSafelist
=
Safelist
.
relaxed
();
// 富文本编辑时一些样式是使用 style 来进行实现的
// 比如红色字体 style="color:red;", 所以需要给所有标签添加 style 属性
// 注意:style 属性会有注入风险 <img STYLE="background-image:url(javascript:alert('XSS'))">
relaxedSafelist
.
addAttributes
(
":all"
,
"style"
,
"class"
);
// 保留 a 标签的 target 属性
relaxedSafelist
.
addAttributes
(
"a"
,
"target"
);
// 支持img 为base64
relaxedSafelist
.
addProtocols
(
"img"
,
"src"
,
"data"
);
// 保留相对路径, 保留相对路径时,必须提供对应的 baseUri 属性,否则依然会被删除
// WHITELIST.preserveRelativeLinks(false);
// 移除 a 标签和 img 标签的一些协议限制,这会导致 xss 防注入失效,如 <img src=javascript:alert("xss")>
// 虽然可以重写 WhiteList#isSafeAttribute 来处理,但是有隐患,所以暂时不支持相对路径
// WHITELIST.removeProtocols("a", "href", "ftp", "http", "https", "mailto");
// WHITELIST.removeProtocols("img", "src", "http", "https");
return
relaxedSafelist
;
}
@Override
public
String
clean
(
String
html
)
{
return
Jsoup
.
clean
(
html
,
baseUri
,
safelist
,
new
Document
.
OutputSettings
().
prettyPrint
(
false
));
}
}
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/clean/XssCleaner.java
0 → 100644
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
clean
;
/**
* 对 html 文本中的有 Xss 风险的数据进行清理
*/
public
interface
XssCleaner
{
/**
* 清理有 Xss 风险的文本
*
* @param html 原 html
* @return 清理后的 html
*/
String
clean
(
String
html
);
}
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/XssFilter.java
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
filter
;
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
filter
;
import
cn.iocoder.yudao.framework.web.config.XssProperties
;
import
cn.iocoder.yudao.framework.web.config.XssProperties
;
import
cn.iocoder.yudao.framework.web.core.clean.XssCleaner
;
import
lombok.AllArgsConstructor
;
import
lombok.AllArgsConstructor
;
import
org.springframework.util.PathMatcher
;
import
org.springframework.util.PathMatcher
;
import
org.springframework.web.filter.OncePerRequestFilter
;
import
org.springframework.web.filter.OncePerRequestFilter
;
...
@@ -13,7 +14,7 @@ import java.io.IOException;
...
@@ -13,7 +14,7 @@ import java.io.IOException;
/**
/**
* Xss 过滤器
* Xss 过滤器
*
*
<p>
* 对 Xss 不了解的胖友,可以看看 http://www.iocoder.cn/Fight/The-new-girl-asked-me-why-AJAX-requests-are-not-secure-I-did-not-answer/
* 对 Xss 不了解的胖友,可以看看 http://www.iocoder.cn/Fight/The-new-girl-asked-me-why-AJAX-requests-are-not-secure-I-did-not-answer/
*
*
* @author 芋道源码
* @author 芋道源码
...
@@ -30,10 +31,12 @@ public class XssFilter extends OncePerRequestFilter {
...
@@ -30,10 +31,12 @@ public class XssFilter extends OncePerRequestFilter {
*/
*/
private
final
PathMatcher
pathMatcher
;
private
final
PathMatcher
pathMatcher
;
private
final
XssCleaner
xssCleaner
;
@Override
@Override
protected
void
doFilterInternal
(
HttpServletRequest
request
,
HttpServletResponse
response
,
FilterChain
filterChain
)
protected
void
doFilterInternal
(
HttpServletRequest
request
,
HttpServletResponse
response
,
FilterChain
filterChain
)
throws
IOException
,
ServletException
{
throws
IOException
,
ServletException
{
filterChain
.
doFilter
(
new
XssRequestWrapper
(
request
),
response
);
filterChain
.
doFilter
(
new
XssRequestWrapper
(
request
,
xssCleaner
),
response
);
}
}
@Override
@Override
...
...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/XssRequestWrapper.java
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
filter
;
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
filter
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.iocoder.yudao.framework.web.core.clean.XssCleaner
;
import
cn.hutool.core.io.IoUtil
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.core.util.ReflectUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.http.HTMLFilter
;
import
cn.iocoder.yudao.framework.common.util.servlet.ServletUtils
;
import
javax.servlet.ReadListener
;
import
javax.servlet.ServletInputStream
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequestWrapper
;
import
javax.servlet.http.HttpServletRequestWrapper
;
import
java.io.BufferedReader
;
import
java.util.LinkedHashMap
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.util.Map
;
import
java.util.Map
;
/**
/**
...
@@ -24,113 +13,79 @@ import java.util.Map;
...
@@ -24,113 +13,79 @@ import java.util.Map;
* @author 芋道源码
* @author 芋道源码
*/
*/
public
class
XssRequestWrapper
extends
HttpServletRequestWrapper
{
public
class
XssRequestWrapper
extends
HttpServletRequestWrapper
{
private
final
XssCleaner
xssCleaner
;
/**
public
XssRequestWrapper
(
HttpServletRequest
request
,
XssCleaner
xssCleaner
)
{
* 基于线程级别的 HTMLFilter 对象,因为它线程非安全
*/
private
static
final
ThreadLocal
<
HTMLFilter
>
HTML_FILTER
=
ThreadLocal
.
withInitial
(()
->
{
HTMLFilter
htmlFilter
=
new
HTMLFilter
();
// 反射修改 encodeQuotes 属性为 false,避免 " 被转移成 " 字符
ReflectUtil
.
setFieldValue
(
htmlFilter
,
"encodeQuotes"
,
false
);
return
htmlFilter
;
});
public
XssRequestWrapper
(
HttpServletRequest
request
)
{
super
(
request
);
super
(
request
);
this
.
xssCleaner
=
xssCleaner
;
}
}
private
static
String
filterXss
(
String
content
)
{
// ============================ parameter ============================
if
(
StrUtil
.
isEmpty
(
content
))
{
return
content
;
}
return
HTML_FILTER
.
get
().
filter
(
content
);
}
// ========== IO 流相关 ==========
@Override
@Override
public
BufferedReader
getReader
()
throws
IOException
{
public
Map
<
String
,
String
[]>
getParameterMap
()
{
return
new
BufferedReader
(
new
InputStreamReader
(
this
.
getInputStream
()));
Map
<
String
,
String
[]>
map
=
new
LinkedHashMap
<>();
Map
<
String
,
String
[]>
parameters
=
super
.
getParameterMap
();
for
(
Map
.
Entry
<
String
,
String
[]>
entry
:
parameters
.
entrySet
())
{
String
[]
values
=
entry
.
getValue
();
for
(
int
i
=
0
;
i
<
values
.
length
;
i
++)
{
values
[
i
]
=
xssCleaner
.
clean
(
values
[
i
]);
}
map
.
put
(
entry
.
getKey
(),
values
);
}
return
map
;
}
}
@Override
@Override
public
S
ervletInputStream
getInputStream
()
throws
IOException
{
public
S
tring
[]
getParameterValues
(
String
name
)
{
// 如果非 json 请求,不进行 Xss 处理
String
[]
values
=
super
.
getParameterValues
(
name
);
if
(
!
ServletUtils
.
isJsonRequest
(
this
)
)
{
if
(
values
==
null
)
{
return
super
.
getInputStream
()
;
return
null
;
}
}
int
count
=
values
.
length
;
// 读取内容,并过滤
String
[]
encodedValues
=
new
String
[
count
];
String
content
=
IoUtil
.
readUtf8
(
super
.
getInputStream
());
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
content
=
filterXss
(
content
);
encodedValues
[
i
]
=
xssCleaner
.
clean
(
values
[
i
]);
final
ByteArrayInputStream
newInputStream
=
new
ByteArrayInputStream
(
content
.
getBytes
());
}
// 返回 ServletInputStream
return
encodedValues
;
return
new
ServletInputStream
()
{
@Override
public
int
read
()
{
return
newInputStream
.
read
();
}
@Override
public
boolean
isFinished
()
{
return
true
;
}
@Override
public
boolean
isReady
()
{
return
true
;
}
@Override
public
void
setReadListener
(
ReadListener
readListener
)
{}
};
}
}
// ========== Param 相关 ==========
@Override
@Override
public
String
getParameter
(
String
name
)
{
public
String
getParameter
(
String
name
)
{
String
value
=
super
.
getParameter
(
name
);
String
value
=
super
.
getParameter
(
name
);
return
filterXss
(
value
);
if
(
value
==
null
)
{
return
null
;
}
return
xssCleaner
.
clean
(
value
);
}
}
// ============================ attribute ============================
@Override
@Override
public
String
[]
getParameterValues
(
String
name
)
{
public
Object
getAttribute
(
String
name
)
{
String
[]
values
=
super
.
getParameterValues
(
name
);
Object
value
=
super
.
getAttribute
(
name
);
if
(
ArrayUtil
.
isEmpty
(
values
))
{
if
(
value
instanceof
String
)
{
return
values
;
xssCleaner
.
clean
((
String
)
value
);
}
// 过滤处理
for
(
int
i
=
0
;
i
<
values
.
length
;
i
++)
{
values
[
i
]
=
filterXss
(
values
[
i
]);
}
}
return
value
s
;
return
value
;
}
}
// ============================ header ============================
@Override
@Override
public
Map
<
String
,
String
[]>
getParameterMap
()
{
public
String
getHeader
(
String
name
)
{
Map
<
String
,
String
[]>
valueMap
=
super
.
getParameterMap
();
String
value
=
super
.
getHeader
(
name
);
if
(
CollUtil
.
isEmpty
(
valueMap
))
{
if
(
value
==
null
)
{
return
valueMap
;
return
null
;
}
// 过滤处理
for
(
Map
.
Entry
<
String
,
String
[]>
entry
:
valueMap
.
entrySet
())
{
String
[]
values
=
entry
.
getValue
();
for
(
int
i
=
0
;
i
<
values
.
length
;
i
++)
{
values
[
i
]
=
filterXss
(
values
[
i
]);
}
}
}
return
valueMap
;
return
xssCleaner
.
clean
(
value
)
;
}
}
// ========== Header 相关 ==========
// ============================ queryString ============================
@Override
@Override
public
String
getHeader
(
String
name
)
{
public
String
getQueryString
()
{
String
value
=
super
.
getHeader
(
name
);
String
value
=
super
.
getQueryString
();
return
filterXss
(
value
);
if
(
value
==
null
)
{
return
null
;
}
return
xssCleaner
.
clean
(
value
);
}
}
}
}
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/json/XssStringJsonDeserializer.java
0 → 100644
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
framework
.
web
.
core
.
json
;
import
cn.iocoder.yudao.framework.web.core.clean.XssCleaner
;
import
com.fasterxml.jackson.core.JsonParser
;
import
com.fasterxml.jackson.core.JsonToken
;
import
com.fasterxml.jackson.databind.DeserializationContext
;
import
com.fasterxml.jackson.databind.deser.std.StringDeserializer
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
java.io.IOException
;
/**
* XSS 过滤 jackson 反序列化器。
* 在反序列化的过程中,会对字符串进行 XSS 过滤。
*
* @author Hccake
*/
@Slf4j
@AllArgsConstructor
public
class
XssStringJsonDeserializer
extends
StringDeserializer
{
private
final
XssCleaner
xssCleaner
;
@Override
public
String
deserialize
(
JsonParser
p
,
DeserializationContext
ctxt
)
throws
IOException
{
if
(
p
.
hasToken
(
JsonToken
.
VALUE_STRING
))
{
return
xssCleaner
.
clean
(
p
.
getText
());
}
JsonToken
t
=
p
.
currentToken
();
// [databind#381]
if
(
t
==
JsonToken
.
START_ARRAY
)
{
return
_deserializeFromArray
(
p
,
ctxt
);
}
// need to gracefully handle byte[] data, as base64
if
(
t
==
JsonToken
.
VALUE_EMBEDDED_OBJECT
)
{
Object
ob
=
p
.
getEmbeddedObject
();
if
(
ob
==
null
)
{
return
null
;
}
if
(
ob
instanceof
byte
[])
{
return
ctxt
.
getBase64Variant
().
encode
((
byte
[])
ob
,
false
);
}
// otherwise, try conversion using toString()...
return
ob
.
toString
();
}
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
if
(
t
==
JsonToken
.
START_OBJECT
)
{
return
ctxt
.
extractScalarFromObject
(
p
,
this
,
_valueClass
);
}
if
(
t
.
isScalarValue
())
{
String
text
=
p
.
getValueAsString
();
return
xssCleaner
.
clean
(
text
);
}
return
(
String
)
ctxt
.
handleUnexpectedToken
(
_valueClass
,
p
);
}
}
yudao-gateway/pom.xml
浏览文件 @
bf7c22e0
...
@@ -46,7 +46,7 @@
...
@@ -46,7 +46,7 @@
<dependency>
<dependency>
<groupId>
com.github.xiaoymin
</groupId>
<groupId>
com.github.xiaoymin
</groupId>
<artifactId>
knife4j-spring-boot-starter
</artifactId>
<artifactId>
knife4j-
openapi2-
spring-boot-starter
</artifactId>
</dependency>
</dependency>
<dependency>
<dependency>
<groupId>
io.swagger
</groupId>
<groupId>
io.swagger
</groupId>
...
...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/convert/codegen/CodegenConvert.java
浏览文件 @
bf7c22e0
...
@@ -11,9 +11,11 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
...
@@ -11,9 +11,11 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
import
cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO
;
import
cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO
;
import
com.baomidou.mybatisplus.generator.config.po.TableField
;
import
com.baomidou.mybatisplus.generator.config.po.TableField
;
import
com.baomidou.mybatisplus.generator.config.po.TableInfo
;
import
com.baomidou.mybatisplus.generator.config.po.TableInfo
;
import
org.apache.ibatis.type.JdbcType
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mapping
;
import
org.mapstruct.Mapping
;
import
org.mapstruct.Mappings
;
import
org.mapstruct.Mappings
;
import
org.mapstruct.Named
;
import
org.mapstruct.factory.Mappers
;
import
org.mapstruct.factory.Mappers
;
import
java.util.List
;
import
java.util.List
;
...
@@ -37,7 +39,7 @@ public interface CodegenConvert {
...
@@ -37,7 +39,7 @@ public interface CodegenConvert {
@Mappings
({
@Mappings
({
@Mapping
(
source
=
"name"
,
target
=
"columnName"
),
@Mapping
(
source
=
"name"
,
target
=
"columnName"
),
@Mapping
(
source
=
"
type"
,
target
=
"d
ataType"
),
@Mapping
(
source
=
"
metaInfo.jdbcType"
,
target
=
"dataType"
,
qualifiedByName
=
"getD
ataType"
),
@Mapping
(
source
=
"comment"
,
target
=
"columnComment"
),
@Mapping
(
source
=
"comment"
,
target
=
"columnComment"
),
@Mapping
(
source
=
"metaInfo.nullable"
,
target
=
"nullable"
),
@Mapping
(
source
=
"metaInfo.nullable"
,
target
=
"nullable"
),
@Mapping
(
source
=
"keyFlag"
,
target
=
"primaryKey"
),
@Mapping
(
source
=
"keyFlag"
,
target
=
"primaryKey"
),
...
@@ -47,6 +49,11 @@ public interface CodegenConvert {
...
@@ -47,6 +49,11 @@ public interface CodegenConvert {
})
})
CodegenColumnDO
convert
(
TableField
bean
);
CodegenColumnDO
convert
(
TableField
bean
);
@Named
(
"getDataType"
)
default
String
getDataType
(
JdbcType
jdbcType
)
{
return
jdbcType
.
name
();
}
// ========== CodegenTableDO 相关 ==========
// ========== CodegenTableDO 相关 ==========
// List<CodegenTableRespVO> convertList02(List<CodegenTableDO> list);
// List<CodegenTableRespVO> convertList02(List<CodegenTableDO> list);
...
...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/CodegenColumnDO.java
浏览文件 @
bf7c22e0
...
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnu
...
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnu
import
com.baomidou.mybatisplus.annotation.KeySequence
;
import
com.baomidou.mybatisplus.annotation.KeySequence
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.baomidou.mybatisplus.generator.config.po.TableField
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.EqualsAndHashCode
;
import
lombok.experimental.Accessors
;
import
lombok.experimental.Accessors
;
...
@@ -29,7 +30,7 @@ public class CodegenColumnDO extends BaseDO {
...
@@ -29,7 +30,7 @@ public class CodegenColumnDO extends BaseDO {
private
Long
id
;
private
Long
id
;
/**
/**
* 表编号
* 表编号
*
*
<p>
* 关联 {@link CodegenTableDO#getId()}
* 关联 {@link CodegenTableDO#getId()}
*/
*/
private
Long
tableId
;
private
Long
tableId
;
...
@@ -41,7 +42,8 @@ public class CodegenColumnDO extends BaseDO {
...
@@ -41,7 +42,8 @@ public class CodegenColumnDO extends BaseDO {
*/
*/
private
String
columnName
;
private
String
columnName
;
/**
/**
* 字段类型
* 数据库字段类型
* 关联 {@link TableField.MetaInfo#getJdbcType()}
*/
*/
private
String
dataType
;
private
String
dataType
;
/**
/**
...
@@ -69,7 +71,7 @@ public class CodegenColumnDO extends BaseDO {
...
@@ -69,7 +71,7 @@ public class CodegenColumnDO extends BaseDO {
/**
/**
* Java 属性类型
* Java 属性类型
*
*
<p>
* 例如说 String、Boolean 等等
* 例如说 String、Boolean 等等
*/
*/
private
String
javaType
;
private
String
javaType
;
...
@@ -79,7 +81,7 @@ public class CodegenColumnDO extends BaseDO {
...
@@ -79,7 +81,7 @@ public class CodegenColumnDO extends BaseDO {
private
String
javaField
;
private
String
javaField
;
/**
/**
* 字典类型
* 字典类型
*
*
<p>
* 关联 DictTypeDO 的 type 属性
* 关联 DictTypeDO 的 type 属性
*/
*/
private
String
dictType
;
private
String
dictType
;
...
@@ -104,7 +106,7 @@ public class CodegenColumnDO extends BaseDO {
...
@@ -104,7 +106,7 @@ public class CodegenColumnDO extends BaseDO {
private
Boolean
listOperation
;
private
Boolean
listOperation
;
/**
/**
* List 查询操作的条件类型
* List 查询操作的条件类型
*
*
<p>
* 枚举 {@link CodegenColumnListConditionEnum}
* 枚举 {@link CodegenColumnListConditionEnum}
*/
*/
private
String
listOperationCondition
;
private
String
listOperationCondition
;
...
@@ -117,7 +119,7 @@ public class CodegenColumnDO extends BaseDO {
...
@@ -117,7 +119,7 @@ public class CodegenColumnDO extends BaseDO {
/**
/**
* 显示类型
* 显示类型
*
*
<p>
* 枚举 {@link CodegenColumnHtmlTypeEnum}
* 枚举 {@link CodegenColumnHtmlTypeEnum}
*/
*/
private
String
htmlType
;
private
String
htmlType
;
...
...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/DefaultDatabaseQueryTest.java
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
module
.
infra
.
service
;
package
cn
.
iocoder
.
yudao
.
module
.
infra
.
service
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.baomidou.mybatisplus.generator.
IDatabaseQuery.DefaultDatabase
Query
;
import
com.baomidou.mybatisplus.generator.
query.Default
Query
;
import
com.baomidou.mybatisplus.generator.config.DataSourceConfig
;
import
com.baomidou.mybatisplus.generator.config.DataSourceConfig
;
import
com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder
;
import
com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder
;
import
com.baomidou.mybatisplus.generator.config.po.TableInfo
;
import
com.baomidou.mybatisplus.generator.config.po.TableInfo
;
...
@@ -19,7 +19,7 @@ public class DefaultDatabaseQueryTest {
...
@@ -19,7 +19,7 @@ public class DefaultDatabaseQueryTest {
ConfigBuilder
builder
=
new
ConfigBuilder
(
null
,
dataSourceConfig
,
null
,
null
,
null
,
null
);
ConfigBuilder
builder
=
new
ConfigBuilder
(
null
,
dataSourceConfig
,
null
,
null
,
null
,
null
);
Default
DatabaseQuery
query
=
new
DefaultDatabase
Query
(
builder
);
Default
Query
query
=
new
Default
Query
(
builder
);
long
time
=
System
.
currentTimeMillis
();
long
time
=
System
.
currentTimeMillis
();
List
<
TableInfo
>
tableInfos
=
query
.
queryTables
();
List
<
TableInfo
>
tableInfos
=
query
.
queryTables
();
...
...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/captcha/CaptchaController.java
浏览文件 @
bf7c22e0
package
cn
.
iocoder
.
yudao
.
module
.
system
.
controller
.
admin
.
captcha
;
package
cn
.
iocoder
.
yudao
.
module
.
system
.
controller
.
admin
.
captcha
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.extra.servlet.ServletUtil
;
import
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog
;
import
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog
;
import
com.anji.captcha.model.common.ResponseModel
;
import
com.xingyuv.captcha.model.common.ResponseModel
;
import
com.anji.captcha.model.vo.CaptchaVO
;
import
com.xingyuv.captcha.model.vo.CaptchaVO
;
import
com.xingyuv.captcha.service.CaptchaService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
...
@@ -10,38 +13,49 @@ import org.springframework.web.bind.annotation.RequestBody;
...
@@ -10,38 +13,49 @@ import org.springframework.web.bind.annotation.RequestBody;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.annotation.Resource
;
import
javax.annotation.security.PermitAll
;
import
javax.annotation.security.PermitAll
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
/**
/**
* 验证码
* 验证码
*
*
* 问题:为什么不直接使用 anji 提供的 CaptchaController,而要另外继承?
* 回答:管理使用 /admin-api/* 作为前缀,所以需要继承!
*
* @author 芋道源码
* @author 芋道源码
*/
*/
@Api
(
tags
=
"管理后台 - 验证码"
)
@Api
(
tags
=
"管理后台 - 验证码"
)
@RestController
(
"adminCaptchaController"
)
@RestController
(
"adminCaptchaController"
)
@RequestMapping
(
"/system/captcha"
)
@RequestMapping
(
"/system/captcha"
)
public
class
CaptchaController
extends
com
.
anji
.
captcha
.
controller
.
CaptchaController
{
public
class
CaptchaController
{
@Resource
private
CaptchaService
captchaService
;
@PostMapping
(
"/get"
)
@PostMapping
(
{
"/get"
}
)
@ApiOperation
(
"获得验证码"
)
@ApiOperation
(
"获得验证码"
)
@PermitAll
@PermitAll
@OperateLog
(
enable
=
false
)
// 避免 Post 请求被记录操作日志
@OperateLog
(
enable
=
false
)
// 避免 Post 请求被记录操作日志
@Override
public
ResponseModel
get
(
@RequestBody
CaptchaVO
data
,
HttpServletRequest
request
)
{
public
ResponseModel
get
(
@RequestBody
CaptchaVO
data
,
HttpServletRequest
request
)
{
return
super
.
get
(
data
,
request
);
assert
request
.
getRemoteHost
()
!=
null
;
data
.
setBrowserInfo
(
getRemoteId
(
request
));
return
captchaService
.
get
(
data
);
}
}
@PostMapping
(
"/check"
)
@PostMapping
(
"/check"
)
@ApiOperation
(
"校验验证码"
)
@ApiOperation
(
"校验验证码"
)
@PermitAll
@PermitAll
@OperateLog
(
enable
=
false
)
// 避免 Post 请求被记录操作日志
@OperateLog
(
enable
=
false
)
// 避免 Post 请求被记录操作日志
@Override
public
ResponseModel
check
(
@RequestBody
CaptchaVO
data
,
HttpServletRequest
request
)
{
public
ResponseModel
check
(
@RequestBody
CaptchaVO
data
,
HttpServletRequest
request
)
{
return
super
.
check
(
data
,
request
);
data
.
setBrowserInfo
(
getRemoteId
(
request
));
return
captchaService
.
check
(
data
);
}
public
static
String
getRemoteId
(
HttpServletRequest
request
)
{
String
ip
=
ServletUtil
.
getClientIP
(
request
);
String
ua
=
request
.
getHeader
(
"user-agent"
);
if
(
StrUtil
.
isNotBlank
(
ip
))
{
return
ip
+
ua
;
}
return
request
.
getRemoteAddr
()
+
ua
;
}
}
}
}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
浏览文件 @
bf7c22e0
...
@@ -22,9 +22,9 @@ import cn.iocoder.yudao.module.system.service.member.MemberService;
...
@@ -22,9 +22,9 @@ import cn.iocoder.yudao.module.system.service.member.MemberService;
import
cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService
;
import
cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService
;
import
cn.iocoder.yudao.module.system.service.social.SocialUserService
;
import
cn.iocoder.yudao.module.system.service.social.SocialUserService
;
import
cn.iocoder.yudao.module.system.service.user.AdminUserService
;
import
cn.iocoder.yudao.module.system.service.user.AdminUserService
;
import
com.
anji
.captcha.model.common.ResponseModel
;
import
com.
xingyuv
.captcha.model.common.ResponseModel
;
import
com.
anji
.captcha.model.vo.CaptchaVO
;
import
com.
xingyuv
.captcha.model.vo.CaptchaVO
;
import
com.
anji
.captcha.service.CaptchaService
;
import
com.
xingyuv
.captcha.service.CaptchaService
;
import
com.google.common.annotations.VisibleForTesting
;
import
com.google.common.annotations.VisibleForTesting
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.beans.factory.annotation.Value
;
...
...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java
浏览文件 @
bf7c22e0
...
@@ -14,7 +14,7 @@ import cn.iocoder.yudao.module.system.service.member.MemberService;
...
@@ -14,7 +14,7 @@ import cn.iocoder.yudao.module.system.service.member.MemberService;
import
cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService
;
import
cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService
;
import
cn.iocoder.yudao.module.system.service.social.SocialUserService
;
import
cn.iocoder.yudao.module.system.service.social.SocialUserService
;
import
cn.iocoder.yudao.module.system.service.user.AdminUserService
;
import
cn.iocoder.yudao.module.system.service.user.AdminUserService
;
import
com.
anji
.captcha.service.CaptchaService
;
import
com.
xingyuv
.captcha.service.CaptchaService
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.mock.mockito.MockBean
;
import
org.springframework.boot.test.mock.mockito.MockBean
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.context.annotation.Import
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论