From b7e91f36e2c19b324e7ea022b787105054776815 Mon Sep 17 00:00:00 2001 From: Easy Date: Wed, 23 Mar 2022 18:21:25 +0800 Subject: [PATCH 01/28] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E9=80=89=E4=B8=ADALL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- smqtt-ui/src/pages/dashboard/acl/Acl.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smqtt-ui/src/pages/dashboard/acl/Acl.vue b/smqtt-ui/src/pages/dashboard/acl/Acl.vue index b5d6cece..89677d5c 100644 --- a/smqtt-ui/src/pages/dashboard/acl/Acl.vue +++ b/smqtt-ui/src/pages/dashboard/acl/Acl.vue @@ -12,7 +12,7 @@ - + ALL @@ -81,7 +81,7 @@ > - + ALL -- Gitee From 1bde463926240a0d75017dfb0589a1c29d68de8c Mon Sep 17 00:00:00 2001 From: Easy Date: Thu, 24 Mar 2022 15:26:59 +0800 Subject: [PATCH 02/28] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E4=BA=86=E5=89=8D?= =?UTF-8?q?=E7=AB=AFACL=E9=BB=98=E8=AE=A4=E9=80=89=E4=B8=AD=E5=80=BC=202.?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9=E4=BA=86ACL=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/github/quickmsg/common/acl/AclAction.java | 7 ++++++- .../github/quickmsg/core/acl/JCasBinAclManager.java | 2 +- .../quickmsg/core/http/acl/AclAddPolicyActor.java | 12 ++++++++++-- smqtt-ui/src/pages/dashboard/acl/Acl.vue | 6 +++--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java index 6ddab260..e4aa09f5 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java @@ -16,5 +16,10 @@ public enum AclAction { /** * mqtt pub */ - PUBLISH + PUBLISH, + + /** + * 新增ACL配置时, 一次性添加以上三种动作 + */ + ALL } diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java index b66d9c0b..5ef53383 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java @@ -70,7 +70,7 @@ public class JCasBinAclManager implements AclManager { @Override public List> get(PolicyModel policyModel) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.getFilteredNamedPolicy("p", 0, policyModel.getSubject(), policyModel.getSource(), policyModel.getAction() == null ? "" : policyModel.getAction().name())) + .map(ef -> enforcer.getFilteredNamedPolicy("p", 0, policyModel.getSubject(), policyModel.getSource(), policyModel.getAction() == null || AclAction.ALL == policyModel.getAction() ? "" : policyModel.getAction().name())) .orElse(Collections.emptyList()); } diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java index a3ed5664..d4a2f203 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java @@ -1,5 +1,6 @@ package io.github.quickmsg.core.http.acl; +import io.github.quickmsg.common.acl.AclAction; import io.github.quickmsg.common.annotation.AllowCors; import io.github.quickmsg.common.annotation.Header; import io.github.quickmsg.common.annotation.Router; @@ -32,8 +33,15 @@ public class AclAddPolicyActor extends AbstractHttpActor { .receive() .asString(StandardCharsets.UTF_8) .map(this.toJson(PolicyModel.class)) - .doOnNext(policyModel -> - ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), policyModel.getAction()) + .doOnNext(policyModel -> { + if (policyModel.getAction() == AclAction.ALL) { + ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), AclAction.CONNECT); + ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), AclAction.SUBSCRIBE); + ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), AclAction.PUBLISH); + } else { + ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), policyModel.getAction()); + } + } ).then(response.sendString(Mono.just("success")).then()); } } diff --git a/smqtt-ui/src/pages/dashboard/acl/Acl.vue b/smqtt-ui/src/pages/dashboard/acl/Acl.vue index 89677d5c..f809e894 100644 --- a/smqtt-ui/src/pages/dashboard/acl/Acl.vue +++ b/smqtt-ui/src/pages/dashboard/acl/Acl.vue @@ -13,7 +13,7 @@ - + ALL @@ -139,7 +139,7 @@ export default { data() { return { params: { - action: "CONNECT", + action: "ALL", current: 1, pageSize: 10, subject: null, @@ -169,7 +169,7 @@ export default { }, methods: { reset() { - this.params.action = "CONNECT" + this.params.action = "ALL" this.params.current = 1 this.params.pageSize = 10 this.params.subject = null -- Gitee From f92dc0ccd2ae6b4216cf95c7fe50ba66f27dee00 Mon Sep 17 00:00:00 2001 From: Easy Date: Thu, 24 Mar 2022 15:36:01 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=99=84?= =?UTF-8?q?=E5=B1=9E=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.yaml | 4 ++-- doc/acl/basic_policy.csv | 2 ++ .../monitor}/prometheus/smqtt-application-1638608184756.json | 0 .../monitor}/prometheus/smqtt-jvm-1638607233202.json | 0 .../monitor}/prometheus/smqtt-netty-1638607270130.json | 0 5 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 doc/acl/basic_policy.csv rename {monitor => doc/monitor}/prometheus/smqtt-application-1638608184756.json (100%) rename {monitor => doc/monitor}/prometheus/smqtt-jvm-1638607233202.json (100%) rename {monitor => doc/monitor}/prometheus/smqtt-netty-1638607270130.json (100%) diff --git a/config/config.yaml b/config/config.yaml index e2ba214b..41cfafc3 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -21,8 +21,8 @@ smqtt: key: /user/server.key # 指定ssl文件 默认系统生成 crt: /user/server.crt # 指定ssl文件 默认系统生成 acl: - aclPolicy: NONE # NONE or FILE or JDBC - filePath: # FILE时配置filePath + aclPolicy: FILE # NONE or FILE or JDBC + filePath: /app/smqtt/basic_policy.csv # FILE时配置filePath jdbcAclConfig: driver: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/smqtt diff --git a/doc/acl/basic_policy.csv b/doc/acl/basic_policy.csv new file mode 100644 index 00000000..1a96640e --- /dev/null +++ b/doc/acl/basic_policy.csv @@ -0,0 +1,2 @@ +p, client01, topicA, PUBLISH +p, client02, topicB, PUBLISH \ No newline at end of file diff --git a/monitor/prometheus/smqtt-application-1638608184756.json b/doc/monitor/prometheus/smqtt-application-1638608184756.json similarity index 100% rename from monitor/prometheus/smqtt-application-1638608184756.json rename to doc/monitor/prometheus/smqtt-application-1638608184756.json diff --git a/monitor/prometheus/smqtt-jvm-1638607233202.json b/doc/monitor/prometheus/smqtt-jvm-1638607233202.json similarity index 100% rename from monitor/prometheus/smqtt-jvm-1638607233202.json rename to doc/monitor/prometheus/smqtt-jvm-1638607233202.json diff --git a/monitor/prometheus/smqtt-netty-1638607270130.json b/doc/monitor/prometheus/smqtt-netty-1638607270130.json similarity index 100% rename from monitor/prometheus/smqtt-netty-1638607270130.json rename to doc/monitor/prometheus/smqtt-netty-1638607270130.json -- Gitee From cd1f9499583ac3de51ae73966a149378724dc222 Mon Sep 17 00:00:00 2001 From: Easy Date: Thu, 24 Mar 2022 15:37:03 +0800 Subject: [PATCH 04/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=99=84?= =?UTF-8?q?=E5=B1=9E=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {doc => config}/acl/basic_policy.csv | 0 .../monitor/prometheus/smqtt-application-1638608184756.json | 0 {doc => config}/monitor/prometheus/smqtt-jvm-1638607233202.json | 0 {doc => config}/monitor/prometheus/smqtt-netty-1638607270130.json | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {doc => config}/acl/basic_policy.csv (100%) rename {doc => config}/monitor/prometheus/smqtt-application-1638608184756.json (100%) rename {doc => config}/monitor/prometheus/smqtt-jvm-1638607233202.json (100%) rename {doc => config}/monitor/prometheus/smqtt-netty-1638607270130.json (100%) diff --git a/doc/acl/basic_policy.csv b/config/acl/basic_policy.csv similarity index 100% rename from doc/acl/basic_policy.csv rename to config/acl/basic_policy.csv diff --git a/doc/monitor/prometheus/smqtt-application-1638608184756.json b/config/monitor/prometheus/smqtt-application-1638608184756.json similarity index 100% rename from doc/monitor/prometheus/smqtt-application-1638608184756.json rename to config/monitor/prometheus/smqtt-application-1638608184756.json diff --git a/doc/monitor/prometheus/smqtt-jvm-1638607233202.json b/config/monitor/prometheus/smqtt-jvm-1638607233202.json similarity index 100% rename from doc/monitor/prometheus/smqtt-jvm-1638607233202.json rename to config/monitor/prometheus/smqtt-jvm-1638607233202.json diff --git a/doc/monitor/prometheus/smqtt-netty-1638607270130.json b/config/monitor/prometheus/smqtt-netty-1638607270130.json similarity index 100% rename from doc/monitor/prometheus/smqtt-netty-1638607270130.json rename to config/monitor/prometheus/smqtt-netty-1638607270130.json -- Gitee From a3ded224909eb641c2e26bd2dc11434dac9d80f7 Mon Sep 17 00:00:00 2001 From: Easy Date: Thu, 24 Mar 2022 15:37:03 +0800 Subject: [PATCH 05/28] readme acl --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 37183db9..ee4135c4 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) 10. SPI接口扩展支持 - 消息管理接口(会话消息/保留消息管理) - 通道管理接口 (管理系统的客户端连接) - - 认证接口 (用于自定义外部认证) + - ~~认证接口 (用于自定义外部认证)~~ - 拦截器 (用户自定义拦截消息) 11. 集群支持(gossip协议实现) 12. 容器化支持 @@ -49,6 +49,7 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) 17. grafana监控集成 - 支持influxdb - 支持prometheus +18. ACL权限管理 ## 尝试一下 -- Gitee From 2d6a4f6238fe4329c3a5810bbaae728ab42e3276 Mon Sep 17 00:00:00 2001 From: Easy Date: Thu, 24 Mar 2022 18:43:44 +0800 Subject: [PATCH 06/28] readme acl --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee4135c4..7113c16a 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) - 支持influxdb - 支持prometheus 18. ACL权限管理 + - 对设备、资源、类型进行鉴权 ## 尝试一下 -- Gitee From 354a51f27566aa5cf9174b43624ffb1a1ee5513b Mon Sep 17 00:00:00 2001 From: Easy Date: Thu, 24 Mar 2022 18:51:22 +0800 Subject: [PATCH 07/28] =?UTF-8?q?=E6=B1=89=E5=8C=96=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.yaml | 2 +- smqtt-ui/src/pages/dashboard/acl/Acl.vue | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 41cfafc3..eb6cff75 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -21,7 +21,7 @@ smqtt: key: /user/server.key # 指定ssl文件 默认系统生成 crt: /user/server.crt # 指定ssl文件 默认系统生成 acl: - aclPolicy: FILE # NONE or FILE or JDBC + aclPolicy: NONE # NONE or FILE or JDBC filePath: /app/smqtt/basic_policy.csv # FILE时配置filePath jdbcAclConfig: driver: com.mysql.jdbc.Driver diff --git a/smqtt-ui/src/pages/dashboard/acl/Acl.vue b/smqtt-ui/src/pages/dashboard/acl/Acl.vue index f809e894..3edf3de6 100644 --- a/smqtt-ui/src/pages/dashboard/acl/Acl.vue +++ b/smqtt-ui/src/pages/dashboard/acl/Acl.vue @@ -5,8 +5,8 @@ class="antAdvancedSearchForm" > - - + + @@ -46,9 +46,9 @@ @cancel="handleCancel" > - + - + - + ALL @@ -122,7 +122,7 @@ const columns = [ customRender: (text, record, index) => index + 1 }, { - title: '设备', + title: '设备ID', dataIndex: "subject", }, { -- Gitee From ae17c4d41aab8bff243694e475d221e3098ce3ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=86=E9=99=86?= <1074455781@qq.com> Date: Fri, 22 Apr 2022 09:08:41 +0800 Subject: [PATCH 08/28] 1 1 --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 7113c16a..eccedb2a 100644 --- a/README.md +++ b/README.md @@ -247,6 +247,9 @@ docker run -it -v <配置文件路径目录>:/conf -p 1883:1883 -p 1999:1999 1 ![image](icon/netty.png) +### 商业化版本 +商业化版本源码出售,高性能架构,请添加微信17512575402! + ## License [Apache License, Version 2.0](LICENSE) -- Gitee From fe0209dfa889463a4982147bd20798385d4f1d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=86=E9=99=86?= <1074455781@qq.com> Date: Fri, 22 Apr 2022 09:18:39 +0800 Subject: [PATCH 09/28] doc --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eccedb2a..7ffdd444 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) | 113.90.145.99:18886 | mqtt端口 |用户名:smqtt 密码:smqtt | | 113.90.145.99:18888 | mqtt over websocket |用户名:smqtt 密码:smqtt | | http://113.90.145.99:18887/smqtt/admin | 管理后台 |用户名:smqtt 密码:smqtt | +## 商业化版本 +商业化版本源码出售,高性能架构,请添加微信17512575402! ## 启动方式 @@ -247,8 +249,6 @@ docker run -it -v <配置文件路径目录>:/conf -p 1883:1883 -p 1999:1999 1 ![image](icon/netty.png) -### 商业化版本 -商业化版本源码出售,高性能架构,请添加微信17512575402! ## License -- Gitee From 6c233c67eb49a5cde054a989096da300291480dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=86=E9=99=86?= <1074455781@qq.com> Date: Sun, 24 Apr 2022 09:03:03 +0800 Subject: [PATCH 10/28] 1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ffdd444..3522c10d 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) | 113.90.145.99:18888 | mqtt over websocket |用户名:smqtt 密码:smqtt | | http://113.90.145.99:18887/smqtt/admin | 管理后台 |用户名:smqtt 密码:smqtt | ## 商业化版本 -商业化版本源码出售,高性能架构,请添加微信17512575402! +如果遇到接入性能问题,或者需要定制化开发的,我们提供商业化版本出售,请添加微信17512575402! ## 启动方式 -- Gitee From 240d8e1f7078035dba1192174a5aeeec5e8ec38c Mon Sep 17 00:00:00 2001 From: wakafff <104560550+wakafff@users.noreply.github.com> Date: Thu, 28 Apr 2022 17:32:45 +0800 Subject: [PATCH 11/28] Update MqttChannel.java Reduce the generated IDs repetition probability,optimize the generation policy of this method (com.fairland.aiot.mqtt.common.channel.MqttChannel#generateId). --- .../java/io/github/quickmsg/common/channel/MqttChannel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java b/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java index 2cecbdc1..9ff5a38c 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java @@ -186,7 +186,7 @@ public class MqttChannel { public long generateId(MqttMessageType type, Integer messageId) { - return (long) connection.channel().hashCode() << 5 | (long) type.value() << 4 | messageId; + return (long) connection.channel().hashCode() << 32 | (long) type.value() << 28 | messageId<<4>>>4; } -- Gitee From e5e8f29ecb69e83b32fbacd5b3baac42b68bf7b1 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Tue, 17 May 2022 22:32:54 +0800 Subject: [PATCH 12/28] acl --- .../github/quickmsg/common/acl/AclAction.java | 6 +- .../quickmsg/common/acl/AclManager.java | 11 ++- .../github/quickmsg/common/acl/AclType.java | 19 +++++ .../common/acl/filter/AclFunction.java | 42 +++++++++++ .../common/acl/model/PolicyModel.java | 3 + .../github/quickmsg/common/auth/AuthBean.java | 17 +++++ ...rdAuthentication.java => AuthManager.java} | 9 +-- .../quickmsg/common/channel/MqttChannel.java | 6 +- .../common/config/AbstractConfiguration.java | 2 +- .../quickmsg/common/config/AuthConfig.java | 62 ++++++++++++++++ .../common/config/BootstrapConfig.java | 1 - .../quickmsg/common/config/SslContext.java | 4 +- .../common/context/ReceiveContext.java | 2 +- .../common/{ack => retry}/AbsAck.java | 3 +- .../quickmsg/common/{ack => retry}/Ack.java | 2 +- .../common/{ack => retry}/AckManager.java | 2 +- .../common/{ack => retry}/RetryAck.java | 2 +- .../common/{ack => retry}/TimeAckManager.java | 2 +- .../quickmsg/common/utils/CsvReader.java | 48 +++++++++++++ .../quickmsg/core/acl/JCasBinAclManager.java | 63 ++++++++++++---- .../core/auth/AuthManagerFactory.java | 33 +++++++++ .../quickmsg/core/auth/FileAuthManager.java | 42 +++++++++++ .../quickmsg/core/auth/FixedAuthManager.java | 22 ++++++ .../quickmsg/core/auth/HttpAuthManager.java | 52 ++++++++++++++ .../quickmsg/core/auth/NoneAuthManager.java | 13 ++++ .../quickmsg/core/auth/SqlAuthManager.java | 71 +++++++++++++++++++ .../core/mqtt/AbstractReceiveContext.java | 21 ++++-- .../quickmsg/core/mqtt/MqttConfiguration.java | 3 +- .../core/protocol/CommonProtocol.java | 2 +- .../core/protocol/ConnectProtocol.java | 7 +- .../core/protocol/PublishAckProtocol.java | 3 +- .../quickmsg/core/ssl/AbstractSslHandler.java | 22 +++--- .../starter/AutoMqttConfiguration.java | 1 - 33 files changed, 530 insertions(+), 68 deletions(-) create mode 100644 smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java create mode 100644 smqtt-common/src/main/java/io/github/quickmsg/common/acl/filter/AclFunction.java create mode 100644 smqtt-common/src/main/java/io/github/quickmsg/common/auth/AuthBean.java rename smqtt-common/src/main/java/io/github/quickmsg/common/auth/{PasswordAuthentication.java => AuthManager.java} (46%) create mode 100644 smqtt-common/src/main/java/io/github/quickmsg/common/config/AuthConfig.java rename smqtt-common/src/main/java/io/github/quickmsg/common/{ack => retry}/AbsAck.java (95%) rename smqtt-common/src/main/java/io/github/quickmsg/common/{ack => retry}/Ack.java (86%) rename smqtt-common/src/main/java/io/github/quickmsg/common/{ack => retry}/AckManager.java (78%) rename smqtt-common/src/main/java/io/github/quickmsg/common/{ack => retry}/RetryAck.java (90%) rename smqtt-common/src/main/java/io/github/quickmsg/common/{ack => retry}/TimeAckManager.java (95%) create mode 100644 smqtt-common/src/main/java/io/github/quickmsg/common/utils/CsvReader.java create mode 100644 smqtt-core/src/main/java/io/github/quickmsg/core/auth/AuthManagerFactory.java create mode 100644 smqtt-core/src/main/java/io/github/quickmsg/core/auth/FileAuthManager.java create mode 100644 smqtt-core/src/main/java/io/github/quickmsg/core/auth/FixedAuthManager.java create mode 100644 smqtt-core/src/main/java/io/github/quickmsg/core/auth/HttpAuthManager.java create mode 100644 smqtt-core/src/main/java/io/github/quickmsg/core/auth/NoneAuthManager.java create mode 100644 smqtt-core/src/main/java/io/github/quickmsg/core/auth/SqlAuthManager.java diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java index e4aa09f5..2a04a14b 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclAction.java @@ -4,10 +4,7 @@ package io.github.quickmsg.common.acl; * @author luxurong */ public enum AclAction { - /** - * mqtt connect - */ - CONNECT, + /** * mqtt sub */ @@ -17,7 +14,6 @@ public enum AclAction { * mqtt pub */ PUBLISH, - /** * 新增ACL配置时, 一次性添加以上三种动作 */ diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java index 202cec0b..7fd8b54f 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java @@ -1,6 +1,7 @@ package io.github.quickmsg.common.acl; import io.github.quickmsg.common.acl.model.PolicyModel; +import io.github.quickmsg.common.channel.MqttChannel; import java.util.List; @@ -9,11 +10,15 @@ import java.util.List; */ public interface AclManager { - boolean auth(String sub, String source, AclAction action); + boolean check(MqttChannel mqttChannel, String source, AclAction action); - boolean add(String sub, String source, AclAction action); + boolean auth(String sub,String source,AclAction action); - boolean delete(String sub, String source, AclAction action); + boolean add(String sub,String source,AclAction action,AclType type); + + + boolean delete(String sub,String source,AclAction action,AclType type); List> get(PolicyModel policyModel); + } diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java new file mode 100644 index 00000000..1a1d8d5d --- /dev/null +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java @@ -0,0 +1,19 @@ +package io.github.quickmsg.common.acl; + +import lombok.Getter; + +/** + * @author luxurong + */ +public enum AclType { + + ALLOW("allow"), + DENY("deny"); + + @Getter + private final String desc; + + AclType(String desc) { + this.desc = desc; + } +} diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/filter/AclFunction.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/filter/AclFunction.java new file mode 100644 index 00000000..6f41fddd --- /dev/null +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/filter/AclFunction.java @@ -0,0 +1,42 @@ +package io.github.quickmsg.common.acl.filter; + +import com.googlecode.aviator.runtime.function.FunctionUtils; +import com.googlecode.aviator.runtime.type.AviatorBoolean; +import com.googlecode.aviator.runtime.type.AviatorObject; +import org.casbin.jcasbin.util.BuiltInFunctions; +import org.casbin.jcasbin.util.function.CustomFunction; + +import java.util.Map; + +/** + * ip{} + * id{} + * all + * + * @author luxurong + */ +public class AclFunction extends CustomFunction { + + + @Override + public AviatorObject call(Map env, AviatorObject arg1, AviatorObject arg2) { + String requestSubject = FunctionUtils.getStringValue(arg1, env); + String subject = FunctionUtils.getStringValue(arg2, env); + if (subject.startsWith("ip")) { + int startIndex = subject.indexOf("{"); + int endIndex = subject.indexOf("}"); + String ip = requestSubject.split(":")[1]; + return AviatorBoolean.valueOf(BuiltInFunctions.ipMatch(ip, subject.substring(startIndex + 1, endIndex))); + } else if (subject.equals("all")) { + return AviatorBoolean.valueOf(true); + } else { + String clientId = requestSubject.split(":")[0]; + return AviatorBoolean.valueOf(clientId.equals(subject)); + } + } + + @Override + public String getName() { + return "filter"; + } +} diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/model/PolicyModel.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/model/PolicyModel.java index 19e79559..117b3bac 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/model/PolicyModel.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/model/PolicyModel.java @@ -1,6 +1,7 @@ package io.github.quickmsg.common.acl.model; import io.github.quickmsg.common.acl.AclAction; +import io.github.quickmsg.common.acl.AclType; import lombok.Data; /** @@ -15,4 +16,6 @@ public class PolicyModel { private AclAction action; + private AclType aclType; + } diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/auth/AuthBean.java b/smqtt-common/src/main/java/io/github/quickmsg/common/auth/AuthBean.java new file mode 100644 index 00000000..1f8c858f --- /dev/null +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/auth/AuthBean.java @@ -0,0 +1,17 @@ +package io.github.quickmsg.common.auth; + +import lombok.Data; + +/** + * @author luxurong + */ +@Data +public class AuthBean { + + private String clientId; + + private String username; + + private String password; + +} diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/auth/PasswordAuthentication.java b/smqtt-common/src/main/java/io/github/quickmsg/common/auth/AuthManager.java similarity index 46% rename from smqtt-common/src/main/java/io/github/quickmsg/common/auth/PasswordAuthentication.java rename to smqtt-common/src/main/java/io/github/quickmsg/common/auth/AuthManager.java index fcd5fc31..ea5e1be6 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/auth/PasswordAuthentication.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/auth/AuthManager.java @@ -1,14 +1,9 @@ package io.github.quickmsg.common.auth; -import io.github.quickmsg.common.StartUp; -import io.github.quickmsg.common.spi.DynamicLoader; - /** * @author luxurong */ -public interface PasswordAuthentication extends StartUp { - - PasswordAuthentication INSTANCE = DynamicLoader.findFirst(PasswordAuthentication.class).orElse(null); +public interface AuthManager { /** * 认证接口 @@ -18,6 +13,6 @@ public interface PasswordAuthentication extends StartUp { * @param clientIdentifier 设备标志 * @return 布尔 */ - boolean auth(String userName, byte[] passwordInBytes, String clientIdentifier); + Boolean auth(String userName, byte[] passwordInBytes, String clientIdentifier); } diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java b/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java index 9ff5a38c..dfdb5eca 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java @@ -1,9 +1,9 @@ package io.github.quickmsg.common.channel; import com.fasterxml.jackson.annotation.JsonIgnore; -import io.github.quickmsg.common.ack.Ack; -import io.github.quickmsg.common.ack.RetryAck; -import io.github.quickmsg.common.ack.TimeAckManager; +import io.github.quickmsg.common.retry.Ack; +import io.github.quickmsg.common.retry.RetryAck; +import io.github.quickmsg.common.retry.TimeAckManager; import io.github.quickmsg.common.enums.ChannelStatus; import io.github.quickmsg.common.topic.SubscribeTopic; import io.github.quickmsg.common.utils.MessageUtils; diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/config/AbstractConfiguration.java b/smqtt-common/src/main/java/io/github/quickmsg/common/config/AbstractConfiguration.java index b73e39ee..23997a17 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/config/AbstractConfiguration.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/config/AbstractConfiguration.java @@ -1,6 +1,5 @@ package io.github.quickmsg.common.config; -import io.github.quickmsg.common.auth.PasswordAuthentication; import io.github.quickmsg.common.rule.RuleChainDefinition; import io.github.quickmsg.common.rule.RuleDefinition; import io.github.quickmsg.common.rule.source.SourceDefinition; @@ -51,5 +50,6 @@ public interface AbstractConfiguration extends Configuration { Map getEnvironmentMap(); + AuthConfig getAuthConfig(); } diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/config/AuthConfig.java b/smqtt-common/src/main/java/io/github/quickmsg/common/config/AuthConfig.java new file mode 100644 index 00000000..977b49c7 --- /dev/null +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/config/AuthConfig.java @@ -0,0 +1,62 @@ +package io.github.quickmsg.common.config; + +import lombok.Data; + +import java.util.Map; + +/** + * @author luxurong + */ +@Data +public class AuthConfig { + + private SqlAuthConfig sql; + + private HttpAuthConfig http; + + private FixedAuthConfig fixed; + + private String file; + + @Data + public static class FixedAuthConfig { + + private String username; + + private String password; + + } + + @Data + public static class HttpAuthConfig { + + private String host; + + private int port; + + private String path; + + private String method; + + private Map headers; + + private Map params; + + } + + + @Data + public static class SqlAuthConfig { + + private String driver; + + private String url; + + private String username; + + private String password; + + private String authSql; + + } +} diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java b/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java index ad2fe78b..fb4318a6 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java @@ -2,7 +2,6 @@ package io.github.quickmsg.common.config; import ch.qos.logback.classic.Level; import com.fasterxml.jackson.annotation.JsonProperty; -import io.github.quickmsg.common.auth.PasswordAuthentication; import io.github.quickmsg.common.metric.MeterType; import io.github.quickmsg.common.rule.RuleChainDefinition; import io.github.quickmsg.common.rule.source.SourceDefinition; diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java b/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java index af55fc6e..62f9e6db 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java @@ -1,6 +1,5 @@ package io.github.quickmsg.common.config; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -9,13 +8,14 @@ import lombok.NoArgsConstructor; */ @Data @NoArgsConstructor -@Builder public class SslContext { private String crt; private String key; + private String ca; + private Boolean enable; diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/context/ReceiveContext.java b/smqtt-common/src/main/java/io/github/quickmsg/common/context/ReceiveContext.java index 70046540..81a7ace7 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/context/ReceiveContext.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/context/ReceiveContext.java @@ -1,6 +1,6 @@ package io.github.quickmsg.common.context; -import io.github.quickmsg.common.ack.TimeAckManager; +import io.github.quickmsg.common.retry.TimeAckManager; import io.github.quickmsg.common.acl.AclManager; import io.github.quickmsg.common.channel.ChannelRegistry; import io.github.quickmsg.common.channel.MqttChannel; diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/AbsAck.java b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/AbsAck.java similarity index 95% rename from smqtt-common/src/main/java/io/github/quickmsg/common/ack/AbsAck.java rename to smqtt-common/src/main/java/io/github/quickmsg/common/retry/AbsAck.java index 8ce52990..706690bd 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/AbsAck.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/AbsAck.java @@ -1,10 +1,9 @@ -package io.github.quickmsg.common.ack; +package io.github.quickmsg.common.retry; import io.netty.util.Timeout; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; /** * @author luxurong diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/Ack.java b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/Ack.java similarity index 86% rename from smqtt-common/src/main/java/io/github/quickmsg/common/ack/Ack.java rename to smqtt-common/src/main/java/io/github/quickmsg/common/retry/Ack.java index 822157c0..26fba301 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/Ack.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/Ack.java @@ -1,4 +1,4 @@ -package io.github.quickmsg.common.ack; +package io.github.quickmsg.common.retry; import io.netty.util.TimerTask; diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/AckManager.java b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/AckManager.java similarity index 78% rename from smqtt-common/src/main/java/io/github/quickmsg/common/ack/AckManager.java rename to smqtt-common/src/main/java/io/github/quickmsg/common/retry/AckManager.java index 12a5f956..1135cbab 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/AckManager.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/AckManager.java @@ -1,4 +1,4 @@ -package io.github.quickmsg.common.ack; +package io.github.quickmsg.common.retry; /** * @author luxurong diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/RetryAck.java b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/RetryAck.java similarity index 90% rename from smqtt-common/src/main/java/io/github/quickmsg/common/ack/RetryAck.java rename to smqtt-common/src/main/java/io/github/quickmsg/common/retry/RetryAck.java index ef4ca1c8..86ccf1e0 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/RetryAck.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/RetryAck.java @@ -1,4 +1,4 @@ -package io.github.quickmsg.common.ack; +package io.github.quickmsg.common.retry; /** * @author luxurong diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/TimeAckManager.java b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/TimeAckManager.java similarity index 95% rename from smqtt-common/src/main/java/io/github/quickmsg/common/ack/TimeAckManager.java rename to smqtt-common/src/main/java/io/github/quickmsg/common/retry/TimeAckManager.java index c1739a5d..cea9942a 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/ack/TimeAckManager.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/retry/TimeAckManager.java @@ -1,4 +1,4 @@ -package io.github.quickmsg.common.ack; +package io.github.quickmsg.common.retry; import io.netty.util.HashedWheelTimer; diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/utils/CsvReader.java b/smqtt-common/src/main/java/io/github/quickmsg/common/utils/CsvReader.java new file mode 100644 index 00000000..6d4fcd55 --- /dev/null +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/utils/CsvReader.java @@ -0,0 +1,48 @@ +package io.github.quickmsg.common.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author luxurong + */ +@Slf4j +public class CsvReader { + + public static List> readCsvValues(String filePath) { + File csv = new File(filePath); + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(csv), StandardCharsets.UTF_8)); + } catch (Exception e) { + e.printStackTrace(); + } + if (br != null) { + String line = ""; + List> records = new ArrayList<>(); + try { + while ((line = br.readLine()) != null) { + List lines=buildLineList(line); + records.add(lines); + } + return records; + } catch (IOException e) { + log.error("read auth error"); + e.printStackTrace(); + } + } + return Collections.emptyList(); + } + + private static List buildLineList(String line) { + return Arrays.stream(line.split(",")) + .collect(Collectors.toList()); + } +} diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java index 5ef53383..0eef8552 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java @@ -3,18 +3,20 @@ package io.github.quickmsg.core.acl; import io.github.quickmsg.common.acl.AclAction; import io.github.quickmsg.common.acl.AclManager; import io.github.quickmsg.common.acl.AclPolicy; -import io.github.quickmsg.common.config.AclConfig; +import io.github.quickmsg.common.acl.AclType; +import io.github.quickmsg.common.acl.filter.AclFunction; import io.github.quickmsg.common.acl.model.PolicyModel; +import io.github.quickmsg.common.channel.MqttChannel; +import io.github.quickmsg.common.config.AclConfig; +import io.github.quickmsg.common.utils.TopicRegexUtils; import lombok.extern.slf4j.Slf4j; import org.casbin.adapter.JDBCAdapter; import org.casbin.jcasbin.main.Enforcer; import org.casbin.jcasbin.model.Model; import org.casbin.jcasbin.persist.file_adapter.FileAdapter; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * @author luxurong @@ -24,27 +26,62 @@ public class JCasBinAclManager implements AclManager { private Enforcer enforcer; + private Map> filterAclTopicActions = new ConcurrentHashMap<>(); + + private String REQUEST_SUBJECT_TEMPLATE = "%s:%s"; + public JCasBinAclManager(AclConfig aclConfig) { if (aclConfig != null) { Model model = new Model(); model.addDef("r", "r", "sub, obj, act"); - model.addDef("p", "p", "sub, obj, act"); - model.addDef("e", "e", "some(where (p.eft == allow))"); - model.addDef("m", "m", "r.sub == p.sub && r.obj == p.obj && r.act == p.act"); + model.addDef("p", "p", " sub, obj, act, eft"); + model.addDef("g", "g", "_, _"); + model.addDef("e", "e", "some(where (p.eft == allow)) && !some(where (p.eft == deny))"); + model.addDef("m", "m", "r.act == p.act && topic(r.obj,p.obj) && filter(r.sub, p.sub)"); if (aclConfig.getAclPolicy() == AclPolicy.JDBC) { AclConfig.JdbcAclConfig jdbcAclConfig = aclConfig.getJdbcAclConfig(); Objects.requireNonNull(jdbcAclConfig); try { - enforcer = new Enforcer(model, new JDBCAdapter(jdbcAclConfig.getDriver(), jdbcAclConfig.getUrl(), jdbcAclConfig.getUsername(), jdbcAclConfig.getPassword())); + enforcer = new Enforcer(model, new JDBCAdapter(jdbcAclConfig.getDriver(), jdbcAclConfig.getUrl(), + jdbcAclConfig.getUsername(), jdbcAclConfig.getPassword())); } catch (Exception e) { log.error("init acl jdbc error {}", aclConfig, e); } } else if (aclConfig.getAclPolicy() == AclPolicy.FILE) { enforcer = new Enforcer(model, new FileAdapter(aclConfig.getFilePath())); + } else { + enforcer = new Enforcer(); + } + enforcer.addFunction("filter", new AclFunction()); + List objects = enforcer.getAllObjects(); + List actions = enforcer.getAllActions(); + for (int i = 0; i < objects.size(); i++) { + Set allObjects = filterAclTopicActions.computeIfAbsent(actions.get(i), a -> new HashSet<>()); + allObjects.add(TopicRegexUtils.regexTopic(objects.get(i))); } } } + @Override + public boolean check(MqttChannel mqttChannel, String source, AclAction action) { + try { + boolean isCheckAcl = Optional.ofNullable(filterAclTopicActions.get(action.name())) + .map(objects -> objects.stream().anyMatch(source::matches)) + .orElse(false); + if (isCheckAcl) { + String subject = String.format(REQUEST_SUBJECT_TEMPLATE, mqttChannel.getClientIdentifier() + , mqttChannel.getAddress()); + return Optional.ofNullable(enforcer) + .map(ef -> ef.enforce(subject, source, action.name())) + .orElse(true); + } + + } catch (Exception e) { + log.error("acl check error",e); + } + return true; + } + @Override public boolean auth(String sub, String source, AclAction action) { return Optional.ofNullable(enforcer) @@ -53,17 +90,17 @@ public class JCasBinAclManager implements AclManager { } @Override - public boolean add(String sub, String source, AclAction action) { + public boolean add(String sub, String source, AclAction action, AclType type) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.addNamedPolicy("p", sub, source, action.name())) + .map(ef -> enforcer.addNamedPolicy("p", sub, source, action.name(),type.getDesc())) .orElse(true); } @Override - public boolean delete(String sub, String source, AclAction action) { + public boolean delete(String sub, String source, AclAction action,AclType type) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.removeNamedPolicy("p", sub, source, action.name())) + .map(ef -> enforcer.removeNamedPolicy("p", sub, source, action.name(),type.getDesc())) .orElse(true); } diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/auth/AuthManagerFactory.java b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/AuthManagerFactory.java new file mode 100644 index 00000000..38146bd3 --- /dev/null +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/AuthManagerFactory.java @@ -0,0 +1,33 @@ +package io.github.quickmsg.core.auth; + +import io.github.quickmsg.common.auth.AuthManager; +import io.github.quickmsg.common.config.AuthConfig; + +/** + * @author luxurong + */ +public class AuthManagerFactory { + + private final AuthConfig authConfig; + + public AuthManagerFactory(AuthConfig authConfig) { + this.authConfig = authConfig; + } + + public AuthManager getAuthManager() { + if (authConfig == null) { + return new NoneAuthManager(); + } + if (authConfig.getHttp() != null) { + return new HttpAuthManager(authConfig); + } else if (authConfig.getFile() != null) { + return new FileAuthManager(authConfig); + } else if (authConfig.getFixed() != null) { + return new FixedAuthManager(authConfig); + } else if (authConfig.getSql() != null) { + return new SqlAuthManager(authConfig); + } else { + return new NoneAuthManager(); + } + } +} \ No newline at end of file diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/auth/FileAuthManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/FileAuthManager.java new file mode 100644 index 00000000..f93a7949 --- /dev/null +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/FileAuthManager.java @@ -0,0 +1,42 @@ +package io.github.quickmsg.core.auth; + +import io.github.quickmsg.common.auth.AuthBean; +import io.github.quickmsg.common.auth.AuthManager; +import io.github.quickmsg.common.config.AuthConfig; +import io.github.quickmsg.common.utils.CsvReader; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * @author luxurong + */ +public class FileAuthManager implements AuthManager { + + private final AuthConfig authConfig; + + private Map authBeanMap = new HashMap<>(); + + public FileAuthManager(AuthConfig authConfig) { + this.authConfig = authConfig; + List> values = CsvReader.readCsvValues(authConfig.getFile()); + for (List es : values) { + AuthBean authBean = new AuthBean(); + authBean.setClientId(es.get(0)); + authBean.setUsername(es.get(1)); + authBean.setPassword(es.get(2)); + authBeanMap.put(authBean.getClientId(),authBean); + } + } + + @Override + public Boolean auth(String userName, byte[] passwordInBytes, String clientIdentifier) { + return Optional.ofNullable(authBeanMap.get(clientIdentifier)) + .map(authBean -> authBean.getUsername().equals(userName) && authBean.getPassword().equals(new String(passwordInBytes))) + .orElse(false); + } + + +} diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/auth/FixedAuthManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/FixedAuthManager.java new file mode 100644 index 00000000..fcb00635 --- /dev/null +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/FixedAuthManager.java @@ -0,0 +1,22 @@ +package io.github.quickmsg.core.auth; + +import io.github.quickmsg.common.auth.AuthManager; +import io.github.quickmsg.common.config.AuthConfig; + +/** + * @author luxurong + */ +public class FixedAuthManager implements AuthManager { + + private final AuthConfig authConfig; + + public FixedAuthManager(AuthConfig authConfig) { + this.authConfig = authConfig; + } + + @Override + public Boolean auth(String userName, byte[] passwordInBytes, String clientIdentifier) { + return authConfig.getFixed().getUsername().equals(userName) + && authConfig.getFixed().getPassword().equals(new String(passwordInBytes)); + } +} diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/auth/HttpAuthManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/HttpAuthManager.java new file mode 100644 index 00000000..29676dbe --- /dev/null +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/HttpAuthManager.java @@ -0,0 +1,52 @@ +package io.github.quickmsg.core.auth; + +import io.github.quickmsg.common.auth.AuthManager; +import io.github.quickmsg.common.config.AuthConfig; +import io.github.quickmsg.common.utils.JacksonUtil; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpResponseStatus; +import reactor.core.publisher.Mono; +import reactor.netty.ByteBufFlux; +import reactor.netty.http.client.HttpClient; + +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * @author luxurong + */ +public class HttpAuthManager implements AuthManager { + + private final AuthConfig authConfig; + + private final HttpClient client; + + public HttpAuthManager(AuthConfig authConfig) { + this.authConfig = authConfig; + AuthConfig.HttpAuthConfig httpAuthConfig = authConfig.getHttp(); + this.client = HttpClient.create().host(httpAuthConfig.getHost()).port(httpAuthConfig.getPort()) + .headers(headers -> { + headers.add(HttpHeaderNames.CONTENT_TYPE.toString(), "application/json;utf-8"); + Optional.ofNullable(httpAuthConfig.getHeaders()) + .ifPresent(addHeaders -> addHeaders.forEach(headers::add)); + }); + } + @Override + public Boolean auth(String userName, byte[] passwordInBytes, String clientIdentifier) { + AuthConfig.HttpAuthConfig httpAuthConfig = authConfig.getHttp(); + Map params = new HashMap<>(); + params.put("clientIdentifier", clientIdentifier); + params.put("username", userName); + params.put("password", new String(passwordInBytes, StandardCharsets.UTF_8)); + params.putAll(httpAuthConfig.getParams()); + return client.post().uri(httpAuthConfig.getPath()) + .send(ByteBufFlux.fromString(Mono.just(JacksonUtil.map2Json(params)))) + .response() + .map(response -> HttpResponseStatus.OK == response.status()) + .block(Duration.ofSeconds(3)); + } + +} diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/auth/NoneAuthManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/NoneAuthManager.java new file mode 100644 index 00000000..bdf6a6b4 --- /dev/null +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/NoneAuthManager.java @@ -0,0 +1,13 @@ +package io.github.quickmsg.core.auth; + +import io.github.quickmsg.common.auth.AuthManager; + +/** + * @author luxurong + */ +public class NoneAuthManager implements AuthManager { + @Override + public Boolean auth(String userName, byte[] passwordInBytes, String clientIdentifier) { + return true; + } +} diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/auth/SqlAuthManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/SqlAuthManager.java new file mode 100644 index 00000000..02e065e1 --- /dev/null +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/auth/SqlAuthManager.java @@ -0,0 +1,71 @@ +package io.github.quickmsg.core.auth; + +import io.github.quickmsg.common.auth.AuthManager; +import io.github.quickmsg.common.config.AuthConfig; +import io.github.quickmsg.source.db.config.HikariCPConnectionProvider; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +/** + * @author luxurong + */ +@Slf4j +public class SqlAuthManager implements AuthManager { + + private AuthConfig authConfig; + + public SqlAuthManager(AuthConfig authConfig) { + this.authConfig = authConfig; + // 初始化数据库连接池 + Properties properties = new Properties(); + properties.put("jdbcUrl", authConfig.getSql().getUrl()); + properties.put("username", authConfig.getSql().getUsername()); + properties.put("password", authConfig.getSql().getPassword()); + + HikariCPConnectionProvider + .singleTon() + .init(properties); + } + + public Boolean auth(String userName, byte[] passwordInBytes, String clientIdentifier) { + Connection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + conn = HikariCPConnectionProvider.singleTon().getConnection(); + ps = conn.prepareStatement(authConfig.getSql().getAuthSql()); + ps.setString(1, userName); + ps.setString(2, new String(passwordInBytes, StandardCharsets.UTF_8)); + ps.setString(3, clientIdentifier); + + rs = ps.executeQuery(); + if (rs.next()) { + return true; + } + } catch (SQLException e) { + log.error("auth error clientIdentifier={}", clientIdentifier, e); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (conn != null) { + conn.close(); + } + } catch (SQLException e) { + log.error("close error clientIdentifier={}", clientIdentifier, e); + } + } + + return false; + } +} diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/AbstractReceiveContext.java b/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/AbstractReceiveContext.java index 60c7991b..0cc9a6e9 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/AbstractReceiveContext.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/AbstractReceiveContext.java @@ -1,15 +1,12 @@ package io.github.quickmsg.core.mqtt; -import io.github.quickmsg.common.ack.TimeAckManager; +import io.github.quickmsg.common.retry.TimeAckManager; import io.github.quickmsg.common.acl.AclManager; -import io.github.quickmsg.common.auth.PasswordAuthentication; +import io.github.quickmsg.common.auth.AuthManager; import io.github.quickmsg.common.channel.ChannelRegistry; import io.github.quickmsg.common.channel.traffic.TrafficHandlerLoader; import io.github.quickmsg.common.cluster.ClusterRegistry; -import io.github.quickmsg.common.config.AbstractConfiguration; -import io.github.quickmsg.common.config.BootstrapConfig; -import io.github.quickmsg.common.config.ConfigCheck; -import io.github.quickmsg.common.config.Configuration; +import io.github.quickmsg.common.config.*; import io.github.quickmsg.common.context.ReceiveContext; import io.github.quickmsg.common.enums.Event; import io.github.quickmsg.common.message.EventRegistry; @@ -22,6 +19,7 @@ import io.github.quickmsg.common.rule.DslExecutor; import io.github.quickmsg.common.topic.TopicRegistry; import io.github.quickmsg.common.transport.Transport; import io.github.quickmsg.core.acl.JCasBinAclManager; +import io.github.quickmsg.core.auth.AuthManagerFactory; import io.github.quickmsg.core.cluster.InJvmClusterRegistry; import io.github.quickmsg.core.mqtt.traffic.CacheTrafficHandlerLoader; import io.github.quickmsg.core.mqtt.traffic.LazyTrafficHandlerLoader; @@ -80,6 +78,8 @@ public abstract class AbstractReceiveContext implements private final AclManager aclManager; + private final AuthManager authManager; + public AbstractReceiveContext(T configuration, Transport transport) { AbstractConfiguration abstractConfiguration = castConfiguration(configuration); RuleDslParser ruleDslParser = new RuleDslParser(abstractConfiguration.getRuleChainDefinitions()); @@ -98,6 +98,7 @@ public abstract class AbstractReceiveContext implements this.messageRegistry.startUp(abstractConfiguration.getEnvironmentMap()); this.metricManager = metricManager(abstractConfiguration.getMeterConfig()); this.aclManager = new JCasBinAclManager(abstractConfiguration.getAclConfig()); + this.authManager = authManagerFactory().provider(abstractConfiguration.getAuthConfig()).getAuthManager(); Optional.ofNullable(abstractConfiguration.getSourceDefinitions()).ifPresent(sourceDefinitions -> sourceDefinitions.forEach(SourceManager::loadSource)); this.timeAckManager = new TimeAckManager(20, TimeUnit.MILLISECONDS, 50); } @@ -118,6 +119,14 @@ public abstract class AbstractReceiveContext implements } } + public AuthManagerProvider authManagerFactory() { + return AuthManagerFactory::new; + } + + public interface AuthManagerProvider { + AuthManagerFactory provider(AuthConfig authConfig); + + } private EventRegistry eventRegistry() { return Event::sender; diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java b/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java index 3285db9b..87d60554 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java @@ -1,6 +1,5 @@ package io.github.quickmsg.core.mqtt; -import io.github.quickmsg.common.auth.PasswordAuthentication; import io.github.quickmsg.common.config.*; import io.github.quickmsg.common.rule.RuleChainDefinition; import io.github.quickmsg.common.rule.source.SourceDefinition; @@ -62,6 +61,8 @@ public class MqttConfiguration extends AbstractSslHandler implements AbstractCon private AclConfig aclConfig; + private AuthConfig authConfig; + private Map environmentMap; private Integer messageMaxSize = 4194304; diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/CommonProtocol.java b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/CommonProtocol.java index 237135ab..125aa237 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/CommonProtocol.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/CommonProtocol.java @@ -1,6 +1,6 @@ package io.github.quickmsg.core.protocol; -import io.github.quickmsg.common.ack.Ack; +import io.github.quickmsg.common.retry.Ack; import io.github.quickmsg.common.channel.MqttChannel; import io.github.quickmsg.common.context.ReceiveContext; import io.github.quickmsg.common.enums.ChannelStatus; diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/ConnectProtocol.java b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/ConnectProtocol.java index a5581563..5c725ed2 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/ConnectProtocol.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/ConnectProtocol.java @@ -2,9 +2,10 @@ package io.github.quickmsg.core.protocol; import io.github.quickmsg.common.acl.AclAction; import io.github.quickmsg.common.acl.AclManager; -import io.github.quickmsg.common.auth.PasswordAuthentication; +import io.github.quickmsg.common.auth.AuthManager; import io.github.quickmsg.common.channel.ChannelRegistry; import io.github.quickmsg.common.channel.MqttChannel; +import io.github.quickmsg.common.config.AuthConfig; import io.github.quickmsg.common.config.ConnectModel; import io.github.quickmsg.common.context.ReceiveContext; import io.github.quickmsg.common.enums.ChannelStatus; @@ -66,7 +67,7 @@ public class ConnectProtocol implements Protocol { TopicRegistry topicRegistry = mqttReceiveContext.getTopicRegistry(); MetricManager metricManager = mqttReceiveContext.getMetricManager(); byte mqttVersion = (byte) mqttConnectVariableHeader.version(); - AclManager aclManager = mqttReceiveContext.getAclManager(); + AuthManager authManager = mqttReceiveContext.getAuthManager(); /*check clientIdentifier exist*/ MqttChannel existMqttChannel = channelRegistry.get(clientIdentifier); if (mqttReceiveContext.getConfiguration().getConnectModel() == ConnectModel.UNIQUE) { @@ -95,7 +96,7 @@ public class ConnectProtocol implements Protocol { false).then(mqttChannel.close()); } /*password check*/ - if (aclManager.auth(clientIdentifier, clientIdentifier, AclAction.CONNECT)) { + if (authManager.auth(mqttConnectPayload.userName(),mqttConnectPayload.passwordInBytes(), clientIdentifier)) { /*cancel defer close not authenticate channel */ mqttChannel.disposableClose(); mqttChannel.setClientIdentifier(mqttConnectPayload.clientIdentifier()); diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishAckProtocol.java b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishAckProtocol.java index 8d7e6b9d..c8ba575a 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishAckProtocol.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishAckProtocol.java @@ -1,11 +1,10 @@ package io.github.quickmsg.core.protocol; -import io.github.quickmsg.common.ack.Ack; +import io.github.quickmsg.common.retry.Ack; import io.github.quickmsg.common.channel.MqttChannel; import io.github.quickmsg.common.context.ReceiveContext; import io.github.quickmsg.common.message.SmqttMessage; import io.github.quickmsg.common.protocol.Protocol; -import io.netty.handler.codec.mqtt.MqttConnectMessage; import io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader; import io.netty.handler.codec.mqtt.MqttMessageType; import io.netty.handler.codec.mqtt.MqttPubAckMessage; diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/ssl/AbstractSslHandler.java b/smqtt-core/src/main/java/io/github/quickmsg/core/ssl/AbstractSslHandler.java index d647de2a..c2678b2d 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/ssl/AbstractSslHandler.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/ssl/AbstractSslHandler.java @@ -4,8 +4,10 @@ import io.github.quickmsg.common.config.Configuration; import io.github.quickmsg.common.config.SslContext; import io.github.quickmsg.core.mqtt.MqttConfiguration; import io.netty.channel.ChannelOption; +import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.util.SelfSignedCertificate; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import reactor.netty.tcp.SslProvider; import reactor.netty.tcp.TcpServer; import reactor.netty.tcp.TcpSslContextSpec; @@ -22,23 +24,19 @@ public class AbstractSslHandler { public void secure(SslProvider.SslContextSpec sslContextSpec, Configuration configuration) { try { if (configuration.getSsl()) { - File cert; - File key; SslContext sslContext = configuration.getSslContext(); - if (sslContext != null && sslContext.getCrt() != null && sslContext.getKey() != null) { - cert = new File(sslContext.getCrt()); - key = new File(sslContext.getKey()); - + SslContextBuilder sslContextBuilder ; + if (sslContext != null) { + sslContextBuilder = SslContextBuilder.forServer(new File(sslContext.getCrt()), new File(sslContext.getKey())); + if(StringUtils.isNotEmpty(sslContext.getCa())){ + sslContextBuilder= sslContextBuilder.trustManager(new File(sslContext.getCa())); + } } else { SelfSignedCertificate ssc = new SelfSignedCertificate(); - cert = ssc.certificate(); - key = ssc.privateKey(); - log.info("SelfSignedCertificate cert {} key {}",cert.getAbsolutePath(),key.getAbsolutePath()); + sslContextBuilder = SslContextBuilder.forServer(ssc.certificate(),ssc.privateKey()); } - TcpSslContextSpec tcpSslContextSpec = TcpSslContextSpec.forServer(cert, key); - sslContextSpec.sslContext(tcpSslContextSpec); + sslContextSpec.sslContext(sslContextBuilder); } - } catch (Exception e) { log.error(" ssl read error", e); } diff --git a/smqtt-spring-boot-starter/src/main/java/io/github/quickmsg/starter/AutoMqttConfiguration.java b/smqtt-spring-boot-starter/src/main/java/io/github/quickmsg/starter/AutoMqttConfiguration.java index 918c1661..c80dfb16 100644 --- a/smqtt-spring-boot-starter/src/main/java/io/github/quickmsg/starter/AutoMqttConfiguration.java +++ b/smqtt-spring-boot-starter/src/main/java/io/github/quickmsg/starter/AutoMqttConfiguration.java @@ -1,7 +1,6 @@ package io.github.quickmsg.starter; import ch.qos.logback.classic.Level; -import io.github.quickmsg.common.auth.PasswordAuthentication; import io.github.quickmsg.common.config.ConnectModel; import io.github.quickmsg.common.utils.IPUtils; import io.github.quickmsg.core.Bootstrap; -- Gitee From 1bb8d76986928b918d1a742f1299a04d82a46a14 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Tue, 17 May 2022 22:35:51 +0800 Subject: [PATCH 13/28] acl --- .../quickmsg/core/http/acl/AclAddPolicyActor.java | 10 +++++----- .../quickmsg/core/http/acl/AclDeletePolicyActor.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java index d4a2f203..f8fa40bb 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclAddPolicyActor.java @@ -1,6 +1,7 @@ package io.github.quickmsg.core.http.acl; import io.github.quickmsg.common.acl.AclAction; +import io.github.quickmsg.common.acl.model.PolicyModel; import io.github.quickmsg.common.annotation.AllowCors; import io.github.quickmsg.common.annotation.Header; import io.github.quickmsg.common.annotation.Router; @@ -8,7 +9,6 @@ import io.github.quickmsg.common.config.Configuration; import io.github.quickmsg.common.context.ContextHolder; import io.github.quickmsg.common.enums.HttpType; import io.github.quickmsg.core.http.AbstractHttpActor; -import io.github.quickmsg.common.acl.model.PolicyModel; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; @@ -35,11 +35,11 @@ public class AclAddPolicyActor extends AbstractHttpActor { .map(this.toJson(PolicyModel.class)) .doOnNext(policyModel -> { if (policyModel.getAction() == AclAction.ALL) { - ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), AclAction.CONNECT); - ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), AclAction.SUBSCRIBE); - ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), AclAction.PUBLISH); + ContextHolder.getReceiveContext().getAclManager().add + (policyModel.getSubject(), policyModel.getSource(), AclAction.SUBSCRIBE,policyModel.getAclType()); + ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), AclAction.PUBLISH,policyModel.getAclType()); } else { - ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), policyModel.getAction()); + ContextHolder.getReceiveContext().getAclManager().add(policyModel.getSubject(), policyModel.getSource(), policyModel.getAction(),policyModel.getAclType()); } } ).then(response.sendString(Mono.just("success")).then()); diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclDeletePolicyActor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclDeletePolicyActor.java index 40c2ad21..1fe8112f 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclDeletePolicyActor.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclDeletePolicyActor.java @@ -1,5 +1,6 @@ package io.github.quickmsg.core.http.acl; +import io.github.quickmsg.common.acl.model.PolicyModel; import io.github.quickmsg.common.annotation.AllowCors; import io.github.quickmsg.common.annotation.Header; import io.github.quickmsg.common.annotation.Router; @@ -7,7 +8,6 @@ import io.github.quickmsg.common.config.Configuration; import io.github.quickmsg.common.context.ContextHolder; import io.github.quickmsg.common.enums.HttpType; import io.github.quickmsg.core.http.AbstractHttpActor; -import io.github.quickmsg.common.acl.model.PolicyModel; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; @@ -33,7 +33,7 @@ public class AclDeletePolicyActor extends AbstractHttpActor { .asString(StandardCharsets.UTF_8) .map(this.toJson(PolicyModel.class)) .doOnNext(policyModel -> - ContextHolder.getReceiveContext().getAclManager().delete(policyModel.getSubject(), policyModel.getSource(), policyModel.getAction()) + ContextHolder.getReceiveContext().getAclManager().delete(policyModel.getSubject(), policyModel.getSource(), policyModel.getAction(),policyModel.getAclType()) ).then(response.sendString(Mono.just("success")).then()); } } -- Gitee From 6358ea86cb2b0bc12aeb5d04888d3322b15e8020 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Tue, 17 May 2022 22:43:56 +0800 Subject: [PATCH 14/28] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/actors/CloseConnectionActor.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/CloseConnectionActor.java diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/CloseConnectionActor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/CloseConnectionActor.java new file mode 100644 index 00000000..d86ab713 --- /dev/null +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/CloseConnectionActor.java @@ -0,0 +1,66 @@ +package io.github.quickmsg.core.http.actors; + +import io.github.quickmsg.common.annotation.AllowCors; +import io.github.quickmsg.common.annotation.Header; +import io.github.quickmsg.common.annotation.Router; +import io.github.quickmsg.common.channel.MqttChannel; +import io.github.quickmsg.common.config.Configuration; +import io.github.quickmsg.common.context.ContextHolder; +import io.github.quickmsg.common.enums.HttpType; +import io.github.quickmsg.common.utils.JacksonUtil; +import io.github.quickmsg.core.http.AbstractHttpActor; +import io.github.quickmsg.core.http.HttpConfiguration; +import io.github.quickmsg.core.http.model.LoginDo; +import io.github.quickmsg.core.http.model.LoginVm; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.reactivestreams.Publisher; +import reactor.core.publisher.Mono; +import reactor.netty.http.server.HttpServerRequest; +import reactor.netty.http.server.HttpServerResponse; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author luxurong + */ +@Router(value = "/smqtt/close/connection", type = HttpType.POST) +@Slf4j +@Header(key = "Content-Type", value = "application/json") +@AllowCors +public class CloseConnectionActor extends AbstractHttpActor { + + @Override + public Publisher doRequest(HttpServerRequest request, HttpServerResponse response, Configuration httpConfiguration) { + return request + .receive() + .asString(StandardCharsets.UTF_8) + .map(this.toJson(Close.class)) + .doOnNext(close -> { + if(CollectionUtils.isNotEmpty(close.getIds())){ + close.getIds().forEach(id->{ + MqttChannel mqttChannel=ContextHolder.getReceiveContext() + .getChannelRegistry() + .get(id); + if(mqttChannel!=null){ + mqttChannel.close().subscribe(); + } + }); + } + }).then(); + } + + + @Data + public static class Close{ + private List ids; + } + + + +} -- Gitee From 410d1ed616072fdbd08c2d5223f5ecfefc9c2d49 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 19 May 2022 20:27:23 +0800 Subject: [PATCH 15/28] acl --- .../github/quickmsg/core/acl/JCasBinAclManager.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java index 0eef8552..1e7ce202 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java @@ -14,6 +14,7 @@ import org.casbin.adapter.JDBCAdapter; import org.casbin.jcasbin.main.Enforcer; import org.casbin.jcasbin.model.Model; import org.casbin.jcasbin.persist.file_adapter.FileAdapter; +import org.casbin.jcasbin.util.BuiltInFunctions; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -26,9 +27,9 @@ public class JCasBinAclManager implements AclManager { private Enforcer enforcer; - private Map> filterAclTopicActions = new ConcurrentHashMap<>(); + private final Map> filterAclTopicActions = new ConcurrentHashMap<>(); - private String REQUEST_SUBJECT_TEMPLATE = "%s:%s"; + private final String REQUEST_SUBJECT_TEMPLATE = "%s:%s"; public JCasBinAclManager(AclConfig aclConfig) { if (aclConfig != null) { @@ -37,7 +38,7 @@ public class JCasBinAclManager implements AclManager { model.addDef("p", "p", " sub, obj, act, eft"); model.addDef("g", "g", "_, _"); model.addDef("e", "e", "some(where (p.eft == allow)) && !some(where (p.eft == deny))"); - model.addDef("m", "m", "r.act == p.act && topic(r.obj,p.obj) && filter(r.sub, p.sub)"); + model.addDef("m", "m", "r.act == p.act && keyMatch2(r.obj,p.obj) && filter(r.sub, p.sub)"); if (aclConfig.getAclPolicy() == AclPolicy.JDBC) { AclConfig.JdbcAclConfig jdbcAclConfig = aclConfig.getJdbcAclConfig(); Objects.requireNonNull(jdbcAclConfig); @@ -57,7 +58,7 @@ public class JCasBinAclManager implements AclManager { List actions = enforcer.getAllActions(); for (int i = 0; i < objects.size(); i++) { Set allObjects = filterAclTopicActions.computeIfAbsent(actions.get(i), a -> new HashSet<>()); - allObjects.add(TopicRegexUtils.regexTopic(objects.get(i))); + allObjects.add(objects.get(i)); } } } @@ -66,7 +67,7 @@ public class JCasBinAclManager implements AclManager { public boolean check(MqttChannel mqttChannel, String source, AclAction action) { try { boolean isCheckAcl = Optional.ofNullable(filterAclTopicActions.get(action.name())) - .map(objects -> objects.stream().anyMatch(source::matches)) + .map(objects -> objects.stream().anyMatch(topic->BuiltInFunctions.keyMatch2(source,topic))) .orElse(false); if (isCheckAcl) { String subject = String.format(REQUEST_SUBJECT_TEMPLATE, mqttChannel.getClientIdentifier() -- Gitee From 50727f0cc4278e83d6e829c20d0bdb28a6407e89 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 19 May 2022 20:30:53 +0800 Subject: [PATCH 16/28] acl --- config/acl/basic_policy.csv | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/acl/basic_policy.csv b/config/acl/basic_policy.csv index 1a96640e..29306ee9 100644 --- a/config/acl/basic_policy.csv +++ b/config/acl/basic_policy.csv @@ -1,2 +1,4 @@ -p, client01, topicA, PUBLISH -p, client02, topicB, PUBLISH \ No newline at end of file +p, client01, topicA, PUBLISH,allow +p, client02, topicB, PUBLISH,deny +p, ip{192.168.0.172/24}, topicB, PUBLISH,deny +p, all, topicB, PUBLISH,allow -- Gitee From 67c0dde2426a26c7563628fd00de0430472a7b3f Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 19 May 2022 21:51:01 +0800 Subject: [PATCH 17/28] acl --- config/acl/basic_policy.csv | 2 +- config/config.yaml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/config/acl/basic_policy.csv b/config/acl/basic_policy.csv index 29306ee9..ca87dd9f 100644 --- a/config/acl/basic_policy.csv +++ b/config/acl/basic_policy.csv @@ -1,4 +1,4 @@ p, client01, topicA, PUBLISH,allow p, client02, topicB, PUBLISH,deny p, ip{192.168.0.172/24}, topicB, PUBLISH,deny -p, all, topicB, PUBLISH,allow +p, all, topicB, SUBSCRIBE,allow diff --git a/config/config.yaml b/config/config.yaml index eb6cff75..14e7c2e9 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -37,6 +37,10 @@ smqtt: enable: true # 开关 username: smqtt # 访问用户名 password: smqtt # 访问密码 + auth: + fixed: + username: smqtt + password: smqtt ws: # websocket配置 enable: true # 开关 port: 8999 # 端口 -- Gitee From e9e18bbde0368c5dca9c987201b4734c5464b822 Mon Sep 17 00:00:00 2001 From: qq542871902 Date: Tue, 24 May 2022 20:25:11 +0800 Subject: [PATCH 18/28] =?UTF-8?q?cdn=E8=AE=BF=E9=97=AE=E4=B8=8D=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- smqtt-ui/vue.config.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/smqtt-ui/vue.config.js b/smqtt-ui/vue.config.js index c08d4da0..f4bfbe6b 100644 --- a/smqtt-ui/vue.config.js +++ b/smqtt-ui/vue.config.js @@ -23,14 +23,14 @@ const assetsCDN = { css: [ ], js: [ - '//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js', - '//cdn.jsdelivr.net/npm/vue-router@3.3.4/dist/vue-router.min.js', - '//cdn.jsdelivr.net/npm/vuex@3.4.0/dist/vuex.min.js', - '//cdn.jsdelivr.net/npm/axios@0.19.2/dist/axios.min.js', - '//cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js', - '//cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js', - '//cdn.jsdelivr.net/npm/@antv/data-set@0.11.4/build/data-set.min.js', - '//cdn.jsdelivr.net/npm/js-cookie@2.2.1/src/js.cookie.min.js' + '//fastly.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js', + '//fastly.jsdelivr.net/npm/vue-router@3.3.4/dist/vue-router.min.js', + '//fastly.jsdelivr.net/npm/vuex@3.4.0/dist/vuex.min.js', + '//fastly.jsdelivr.net/npm/axios@0.19.2/dist/axios.min.js', + '//fastly.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js', + '//fastly.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js', + '//fastly.jsdelivr.net/npm/@antv/data-set@0.11.4/build/data-set.min.js', + '//fastly.jsdelivr.net/npm/js-cookie@2.2.1/src/js.cookie.min.js' ] } -- Gitee From fd7bb24c238e5848e022ab35c78b0476dc3281d4 Mon Sep 17 00:00:00 2001 From: qq542871902 Date: Wed, 25 May 2022 18:39:32 +0800 Subject: [PATCH 19/28] =?UTF-8?q?acl=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- smqtt-ui/src/pages/dashboard/acl/Acl.vue | 79 ++++++++++++++++-------- smqtt-ui/src/router/config.js | 2 +- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/smqtt-ui/src/pages/dashboard/acl/Acl.vue b/smqtt-ui/src/pages/dashboard/acl/Acl.vue index 3edf3de6..1cdd8972 100644 --- a/smqtt-ui/src/pages/dashboard/acl/Acl.vue +++ b/smqtt-ui/src/pages/dashboard/acl/Acl.vue @@ -4,21 +4,17 @@ layout="inline" class="antAdvancedSearchForm" > - - - + + - - + + - + ALL - - CONNECT - SUBSCRIBE @@ -26,29 +22,41 @@ PUBLISH - + + + + + DENY + + + ALLOW + + + 新增 - 查询 - 重置 - 删除 + 查询 + 重置 + 删除 + + - + - + ALL - - CONNECT - SUBSCRIBE @@ -96,6 +101,25 @@ + + + + + DENY + + + ALLOW + + + +
@@ -122,16 +146,20 @@ const columns = [ customRender: (text, record, index) => index + 1 }, { - title: '设备ID', + title: '过滤规则', dataIndex: "subject", }, { - title: '资源', + title: 'topic名称', dataIndex: "source", }, { title: '类型', dataIndex: "action", + }, + { + title: '访问策略', + dataIndex: "aclType", } ] export default { @@ -143,7 +171,8 @@ export default { current: 1, pageSize: 10, subject: null, - source: null + source: null, + aclType: "allow" }, pagination: { @@ -153,7 +182,6 @@ export default { showTotal: total => `Total ${total} items`, // 显示总数 onShowSizeChange: (page, pageSize) => { this.pagination.pageSize = pageSize - console.log(page) } }, selectedRowKeys: [], @@ -174,6 +202,7 @@ export default { this.params.pageSize = 10 this.params.subject = null this.params.source = null + this.params.aclType = null this.queryActionData() }, diff --git a/smqtt-ui/src/router/config.js b/smqtt-ui/src/router/config.js index affdeb73..a59bb640 100644 --- a/smqtt-ui/src/router/config.js +++ b/smqtt-ui/src/router/config.js @@ -56,7 +56,7 @@ const options = { }, { path: 'acl', - name: '权限校验', + name: '访问控制', component: () => import('@/pages/dashboard/acl'), } -- Gitee From 70a569d42e8ae03b505619f9b3642a1118b8cc32 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Wed, 25 May 2022 21:35:55 +0800 Subject: [PATCH 20/28] acl --- .../io/github/quickmsg/core/spi/DefaultProtocolAdaptor.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/spi/DefaultProtocolAdaptor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/spi/DefaultProtocolAdaptor.java index ff606b41..b14fe7aa 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/spi/DefaultProtocolAdaptor.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/spi/DefaultProtocolAdaptor.java @@ -54,15 +54,11 @@ public class DefaultProtocolAdaptor implements ProtocolAdaptor { .doParseProtocol(smqttMessage, mqttChannel) .contextWrite(context -> context.putNonNull(ReceiveContext.class, receiveContext)) .subscribeOn(scheduler) - .onErrorContinue(((throwable, o) -> { - - })) .subscribe(aVoid -> { }, error -> { log.error("channel {} chooseProtocol: {} error {}", mqttChannel, mqttMessage, error.getMessage()); ReactorNetty.safeRelease(mqttMessage.payload()); }, () -> ReactorNetty.safeRelease(mqttMessage.payload()))); - } -- Gitee From b09f106e6db0eb883aee3e08453eae9b0e1865d8 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Wed, 25 May 2022 22:24:18 +0800 Subject: [PATCH 21/28] acl --- .../io/github/quickmsg/AbstractStarter.java | 1 + .../github/quickmsg/common/acl/AclType.java | 13 +++++------- .../common/config/BootstrapConfig.java | 12 ++++++----- .../quickmsg/common/config/SslContext.java | 4 ++++ .../io/github/quickmsg/core/Bootstrap.java | 4 ++++ .../quickmsg/core/acl/JCasBinAclManager.java | 11 +++++++--- .../core/http/acl/AclQueryPolicyActor.java | 2 ++ smqtt-ui/src/pages/dashboard/acl/Acl.vue | 21 +++++++++++-------- 8 files changed, 43 insertions(+), 25 deletions(-) diff --git a/smqtt-bootstrap/src/main/java/io/github/quickmsg/AbstractStarter.java b/smqtt-bootstrap/src/main/java/io/github/quickmsg/AbstractStarter.java index e1078de3..5c95e352 100644 --- a/smqtt-bootstrap/src/main/java/io/github/quickmsg/AbstractStarter.java +++ b/smqtt-bootstrap/src/main/java/io/github/quickmsg/AbstractStarter.java @@ -57,6 +57,7 @@ public abstract class AbstractStarter { .ruleChainDefinitions(config.getSmqttConfig().getRuleChainDefinitions()) .sourceDefinitions(config.getSmqttConfig().getRuleSources()) .aclConfig(config.getSmqttConfig().getAcl()) + .authConfig(config.getSmqttConfig().getAuthConfig()) .build() .doOnStarted(AbstractStarter::printUiUrl).startAwait(); diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java index 1a1d8d5d..8d27b2b2 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java @@ -1,19 +1,16 @@ package io.github.quickmsg.common.acl; -import lombok.Getter; /** * @author luxurong */ public enum AclType { - ALLOW("allow"), - DENY("deny"); + ALL, + + ALLOW, + + DENY; - @Getter - private final String desc; - AclType(String desc) { - this.desc = desc; - } } diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java b/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java index fb4318a6..bcee19a1 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/config/BootstrapConfig.java @@ -108,6 +108,13 @@ public class BootstrapConfig { */ @JsonProperty("acl") private AclConfig acl; + + + /** + * auth配置 + */ + @JsonProperty("auth") + private AuthConfig authConfig; } @Data @@ -191,11 +198,6 @@ public class BootstrapConfig { */ Map childOptions; - /** - * PasswordAuthentication - */ - PasswordAuthentication authentication; - } @Data diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java b/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java index 62f9e6db..d3492045 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/config/SslContext.java @@ -1,5 +1,7 @@ package io.github.quickmsg.common.config; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -7,7 +9,9 @@ import lombok.NoArgsConstructor; * @author luxurong */ @Data +@Builder @NoArgsConstructor +@AllArgsConstructor public class SslContext { private String crt; diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/Bootstrap.java b/smqtt-core/src/main/java/io/github/quickmsg/core/Bootstrap.java index 2513c517..ac2f762c 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/Bootstrap.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/Bootstrap.java @@ -2,6 +2,7 @@ package io.github.quickmsg.core; import ch.qos.logback.classic.Level; import io.github.quickmsg.common.config.AclConfig; +import io.github.quickmsg.common.config.AuthConfig; import io.github.quickmsg.common.config.BootstrapConfig; import io.github.quickmsg.common.config.SslContext; import io.github.quickmsg.common.rule.RuleChainDefinition; @@ -56,6 +57,8 @@ public class Bootstrap { private AclConfig aclConfig; + private AuthConfig authConfig; + private final List> transports = new ArrayList<>(); @Builder.Default @@ -89,6 +92,7 @@ public class Bootstrap { Optional.ofNullable(clusterConfig).ifPresent(mqttConfiguration::setClusterConfig); Optional.ofNullable(meterConfig).ifPresent(mqttConfiguration::setMeterConfig); Optional.ofNullable(aclConfig).ifPresent(mqttConfiguration::setAclConfig); + Optional.ofNullable(authConfig).ifPresent(mqttConfiguration::setAuthConfig); if (websocketConfig != null && websocketConfig.isEnable()) { mqttConfiguration.setWebSocketPort(websocketConfig.getPort()); diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java index 1e7ce202..4b373422 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java @@ -93,7 +93,7 @@ public class JCasBinAclManager implements AclManager { @Override public boolean add(String sub, String source, AclAction action, AclType type) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.addNamedPolicy("p", sub, source, action.name(),type.getDesc())) + .map(ef -> enforcer.addNamedPolicy("p", sub, source, action.name(),type.name())) .orElse(true); } @@ -101,14 +101,19 @@ public class JCasBinAclManager implements AclManager { @Override public boolean delete(String sub, String source, AclAction action,AclType type) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.removeNamedPolicy("p", sub, source, action.name(),type.getDesc())) + .map(ef -> enforcer.removeNamedPolicy("p", sub, source, action.name(),type.name())) .orElse(true); } @Override public List> get(PolicyModel policyModel) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.getFilteredNamedPolicy("p", 0, policyModel.getSubject(), policyModel.getSource(), policyModel.getAction() == null || AclAction.ALL == policyModel.getAction() ? "" : policyModel.getAction().name())) + .map(ef -> enforcer + .getFilteredNamedPolicy("p", 0, + policyModel.getSubject(), policyModel.getSource(), + policyModel.getAction() == null || AclAction.ALL == policyModel.getAction() ? "" : policyModel.getAction().name(), + policyModel.getAclType()==null || AclType.ALL == policyModel.getAclType() ?"":policyModel.getAclType().name()) + ) .orElse(Collections.emptyList()); } diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java index 0fe94f45..0ae34159 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java @@ -1,5 +1,6 @@ package io.github.quickmsg.core.http.acl; +import io.github.quickmsg.common.acl.AclType; import io.github.quickmsg.common.acl.model.PolicyModel; import io.github.quickmsg.common.annotation.AllowCors; import io.github.quickmsg.common.annotation.Header; @@ -39,6 +40,7 @@ public class AclQueryPolicyActor extends AbstractHttpActor { map.put("subject", item.size() >= 3 ? item.get(0) : null); map.put("source", item.size() >= 3 ? item.get(1) : null); map.put("action", item.size() >= 3 ? item.get(2) : null); + map.put("aclType", item.size() >= 4 ? item.get(3) : null); return map; }).collect(Collectors.toList()); response.sendString(Mono.just(JacksonUtil.bean2Json(collect))).then().subscribe(); diff --git a/smqtt-ui/src/pages/dashboard/acl/Acl.vue b/smqtt-ui/src/pages/dashboard/acl/Acl.vue index 1cdd8972..61120d30 100644 --- a/smqtt-ui/src/pages/dashboard/acl/Acl.vue +++ b/smqtt-ui/src/pages/dashboard/acl/Acl.vue @@ -24,11 +24,14 @@ - - + + + ALL + + DENY - + ALLOW @@ -89,9 +92,6 @@ > - - ALL - SUBSCRIBE @@ -111,10 +111,13 @@ > - + + ALL + + DENY - + ALLOW @@ -172,7 +175,7 @@ export default { pageSize: 10, subject: null, source: null, - aclType: "allow" + aclType: "ALL" }, pagination: { -- Gitee From b051e653437f026128854e92a5f404a212383e4b Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Wed, 25 May 2022 22:28:23 +0800 Subject: [PATCH 22/28] acl --- smqtt-ui/src/pages/dashboard/acl/Acl.vue | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/smqtt-ui/src/pages/dashboard/acl/Acl.vue b/smqtt-ui/src/pages/dashboard/acl/Acl.vue index 61120d30..c894c6b9 100644 --- a/smqtt-ui/src/pages/dashboard/acl/Acl.vue +++ b/smqtt-ui/src/pages/dashboard/acl/Acl.vue @@ -4,10 +4,10 @@ layout="inline" class="antAdvancedSearchForm" > - + - + @@ -23,7 +23,7 @@ - + ALL @@ -57,9 +57,9 @@ @cancel="handleCancel" > - + - + index + 1 }, { - title: '过滤规则', + title: '规则', dataIndex: "subject", }, { - title: 'topic名称', + title: 'topic', dataIndex: "source", }, { @@ -161,7 +161,7 @@ const columns = [ dataIndex: "action", }, { - title: '访问策略', + title: '策略', dataIndex: "aclType", } ] -- Gitee From 33b07ac5d2bac373e979e77c1fb4218047e70a52 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Wed, 25 May 2022 22:36:43 +0800 Subject: [PATCH 23/28] acl --- config/config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 14e7c2e9..b9a5a188 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -21,11 +21,11 @@ smqtt: key: /user/server.key # 指定ssl文件 默认系统生成 crt: /user/server.crt # 指定ssl文件 默认系统生成 acl: - aclPolicy: NONE # NONE or FILE or JDBC - filePath: /app/smqtt/basic_policy.csv # FILE时配置filePath + aclPolicy: JDBC # NONE or FILE or JDBC + filePath: D:\smqtt\config\acl\basic_policy.csv # FILE时配置filePath jdbcAclConfig: driver: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306/smqtt + url: jdbc:mysql://113.90.145.99:18889/smqtt username: root password: 123 http: # http相关配置 端口固定60000 -- Gitee From e86a272a980c731b725e2639b246dd17286555e6 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 26 May 2022 22:39:40 +0800 Subject: [PATCH 24/28] ui --- .../quickmsg/common/acl/AclManager.java | 2 -- .../github/quickmsg/common/acl/AclType.java | 25 ++++++++++++++++--- .../quickmsg/common/channel/MqttChannel.java | 3 ++- .../quickmsg/core/acl/JCasBinAclManager.java | 15 +++-------- .../core/http/acl/AclQueryPolicyActor.java | 2 +- .../core/http/actors/ConnectionActor.java | 2 +- .../core/protocol/PublishProtocol.java | 2 +- .../core/protocol/SubscribeProtocol.java | 7 ++++-- smqtt-ui/src/pages/dashboard/acl/Acl.vue | 23 +++++++++++------ 9 files changed, 51 insertions(+), 30 deletions(-) diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java index 7fd8b54f..9bb4979e 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclManager.java @@ -12,8 +12,6 @@ public interface AclManager { boolean check(MqttChannel mqttChannel, String source, AclAction action); - boolean auth(String sub,String source,AclAction action); - boolean add(String sub,String source,AclAction action,AclType type); diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java index 8d27b2b2..a5cf84e8 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/acl/AclType.java @@ -1,16 +1,35 @@ package io.github.quickmsg.common.acl; +import lombok.Getter; + /** * @author luxurong */ public enum AclType { - ALL, + ALL(""), + + + ALLOW("allow"), + + DENY("deny"); + + @Getter + private final String desc; - ALLOW, + AclType(String desc) { + this.desc = desc; + } - DENY; + public static AclType fromDesc(String desc) { + for (AclType type : AclType.values()) { + if (type.desc.equals(desc)) { + return type; + } + } + return null; + } } diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java b/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java index dfdb5eca..2ee7018b 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/channel/MqttChannel.java @@ -101,7 +101,8 @@ public class MqttChannel { mqttChannel.setQos2MsgCache(new ConcurrentHashMap<>()); mqttChannel.setConnection(connection); mqttChannel.setStatus(ChannelStatus.INIT); - mqttChannel.setAddress(connection.address().toString()); + mqttChannel.setAddress(connection.address().toString() + .replaceAll("/", "")); mqttChannel.setTimeAckManager(timeAckManager); return mqttChannel; } diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java index 4b373422..a7992c62 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/acl/JCasBinAclManager.java @@ -71,7 +71,7 @@ public class JCasBinAclManager implements AclManager { .orElse(false); if (isCheckAcl) { String subject = String.format(REQUEST_SUBJECT_TEMPLATE, mqttChannel.getClientIdentifier() - , mqttChannel.getAddress()); + , mqttChannel.getAddress().split(":")[0]); return Optional.ofNullable(enforcer) .map(ef -> ef.enforce(subject, source, action.name())) .orElse(true); @@ -83,17 +83,10 @@ public class JCasBinAclManager implements AclManager { return true; } - @Override - public boolean auth(String sub, String source, AclAction action) { - return Optional.ofNullable(enforcer) - .map(ef -> enforcer.enforce(sub, source, action.name())) - .orElse(true); - } - @Override public boolean add(String sub, String source, AclAction action, AclType type) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.addNamedPolicy("p", sub, source, action.name(),type.name())) + .map(ef -> enforcer.addNamedPolicy("p", sub, source, action.name(),type.getDesc())) .orElse(true); } @@ -101,7 +94,7 @@ public class JCasBinAclManager implements AclManager { @Override public boolean delete(String sub, String source, AclAction action,AclType type) { return Optional.ofNullable(enforcer) - .map(ef -> enforcer.removeNamedPolicy("p", sub, source, action.name(),type.name())) + .map(ef -> enforcer.removeNamedPolicy("p", sub, source, action.name(),type.getDesc())) .orElse(true); } @@ -112,7 +105,7 @@ public class JCasBinAclManager implements AclManager { .getFilteredNamedPolicy("p", 0, policyModel.getSubject(), policyModel.getSource(), policyModel.getAction() == null || AclAction.ALL == policyModel.getAction() ? "" : policyModel.getAction().name(), - policyModel.getAclType()==null || AclType.ALL == policyModel.getAclType() ?"":policyModel.getAclType().name()) + policyModel.getAclType()==null || AclType.ALL == policyModel.getAclType() ?"":policyModel.getAclType().getDesc()) ) .orElse(Collections.emptyList()); } diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java index 0ae34159..52b544a3 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/http/acl/AclQueryPolicyActor.java @@ -40,7 +40,7 @@ public class AclQueryPolicyActor extends AbstractHttpActor { map.put("subject", item.size() >= 3 ? item.get(0) : null); map.put("source", item.size() >= 3 ? item.get(1) : null); map.put("action", item.size() >= 3 ? item.get(2) : null); - map.put("aclType", item.size() >= 4 ? item.get(3) : null); + map.put("aclType", item.size() >= 4 ? AclType.fromDesc(item.get(3)).name() : null); return map; }).collect(Collectors.toList()); response.sendString(Mono.just(JacksonUtil.bean2Json(collect))).then().subscribe(); diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/ConnectionActor.java b/smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/ConnectionActor.java index bd539500..e53deb88 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/ConnectionActor.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/http/actors/ConnectionActor.java @@ -35,7 +35,7 @@ public class ConnectionActor extends AbstractHttpActor { ContextHolder.getReceiveContext().getChannelRegistry().getChannels() .stream() .map(record -> { - record.setAddress(record.getAddress().replaceAll("/", "")); + record.setAddress(record.getAddress()); return record; }).collect(Collectors.toList()) ))) diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishProtocol.java b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishProtocol.java index bad4dbc9..2d911235 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishProtocol.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/PublishProtocol.java @@ -49,7 +49,7 @@ public class PublishProtocol implements Protocol { MetricManagerHolder.metricManager.getMetricRegistry().getMetricCounter(CounterType.PUBLISH_EVENT).increment(); MqttPublishMessage message = smqttMessage.getMessage(); AclManager aclManager = receiveContext.getAclManager(); - if (!mqttChannel.getIsMock() && !aclManager.auth(mqttChannel.getClientIdentifier(), message.variableHeader().topicName(), AclAction.PUBLISH)) { + if (!mqttChannel.getIsMock() && !aclManager.check(mqttChannel, message.variableHeader().topicName(), AclAction.PUBLISH)) { log.warn("mqtt【{}】publish topic 【{}】 acl not authorized ", mqttChannel.getConnection(), message.variableHeader().topicName()); return Mono.empty(); } diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/SubscribeProtocol.java b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/SubscribeProtocol.java index 4142b276..8d5fae32 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/SubscribeProtocol.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/protocol/SubscribeProtocol.java @@ -15,6 +15,7 @@ import io.github.quickmsg.common.topic.TopicRegistry; import io.netty.handler.codec.mqtt.MqttMessageType; import io.netty.handler.codec.mqtt.MqttSubAckMessage; import io.netty.handler.codec.mqtt.MqttSubscribeMessage; +import org.apache.commons.collections.CollectionUtils; import reactor.core.publisher.Mono; import reactor.util.context.ContextView; @@ -45,9 +46,11 @@ public class SubscribeProtocol implements Protocol { .stream() .peek(mqttTopicSubscription -> this.loadRetainMessage(messageRegistry, mqttChannel, mqttTopicSubscription.topicName())) .map(mqttTopicSubscription -> new SubscribeTopic(mqttTopicSubscription.topicName(), mqttTopicSubscription.qualityOfService(), mqttChannel)) - .filter(subscribeTopic -> aclManager.auth(mqttChannel.getClientIdentifier(), subscribeTopic.getTopicFilter(), AclAction.SUBSCRIBE)) + .filter(subscribeTopic -> aclManager.check(mqttChannel, subscribeTopic.getTopicFilter(), AclAction.SUBSCRIBE)) .collect(Collectors.toSet()); - topicRegistry.registrySubscribesTopic(mqttTopicSubscriptions); + if(CollectionUtils.isNotEmpty(mqttTopicSubscriptions)){ + topicRegistry.registrySubscribesTopic(mqttTopicSubscriptions); + } }).then(mqttChannel.write( MqttMessageBuilder.buildSubAck( message.variableHeader().messageId(), diff --git a/smqtt-ui/src/pages/dashboard/acl/Acl.vue b/smqtt-ui/src/pages/dashboard/acl/Acl.vue index c894c6b9..a3f6f9d1 100644 --- a/smqtt-ui/src/pages/dashboard/acl/Acl.vue +++ b/smqtt-ui/src/pages/dashboard/acl/Acl.vue @@ -90,7 +90,8 @@ ] }]" > - + SUBSCRIBE @@ -109,11 +110,8 @@ ] }]" > - + - - ALL - DENY @@ -192,7 +190,12 @@ export default { dataSource: null, visible: false, confirmLoading: false, - form: {} + form: { + action: "PUBLISH", + subject: null, + source: null, + aclType: "ALLOW" + } } }, mounted() { @@ -242,8 +245,12 @@ export default { }) this.visible = false; this.confirmLoading = false - this.params.action = this.form.action - this.form = {} + this.form = { + action: "PUBLISH", + subject: null, + source: null, + aclType: "ALLOW" + } await this.queryActionData() }, -- Gitee From 9225ab3f66ae9c5fae6cb735876dd7a410d7eb75 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 26 May 2022 22:44:05 +0800 Subject: [PATCH 25/28] =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.yaml | 6 +++--- .../io/github/quickmsg/core/mqtt/MqttConfiguration.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index b9a5a188..c86325e6 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -5,9 +5,9 @@ smqtt: notKickSecond: 30 # KICK互踢模式生效, 单位秒, 指定时间内客户端不互踢, 避免客户端自动连接持续互踢 port: 1883 # mqtt端口号 wiretap: false # 二进制日志 前提是 smqtt.logLevel = DEBUG - bossThreadSize: 8 # boss线程 默认=cpu核心数 - workThreadSize: 16 # work线程 默认=cpu核心数*2 - businessThreadSize: 32 # 业务线程数 默认=cpu核心数*10 + bossThreadSize: 1 # boss线程 默认=1 + workThreadSize: 9 # work线程 默认=cpu核心数+1 + businessThreadSize: 8 # 业务线程数 默认=cpu核心数 businessQueueSize: 100000 #业务队列 默认=100000 messageMaxSize: 4194304 # 接收消息的最大限制 默认4194304(4M) lowWaterMark: 4000000 # 不建议配置 默认 32768 diff --git a/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java b/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java index 87d60554..e4ee90bd 100644 --- a/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java +++ b/smqtt-core/src/main/java/io/github/quickmsg/core/mqtt/MqttConfiguration.java @@ -39,7 +39,7 @@ public class MqttConfiguration extends AbstractSslHandler implements AbstractCon private Integer workThreadSize = Runtime.getRuntime().availableProcessors() * 2; - private Integer businessThreadSize = Runtime.getRuntime().availableProcessors() * 4; + private Integer businessThreadSize = Runtime.getRuntime().availableProcessors() ; private Integer businessQueueSize = 100000; -- Gitee From ed97f7b375673fa4a67ae25d27e943a3d42c7ba3 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 26 May 2022 22:50:10 +0800 Subject: [PATCH 26/28] =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++--- smqtt-bootstrap/src/test/java/ClusterNode1.java | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e3476053..939dc033 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,12 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) - 支持influxdb - 支持prometheus 18. ACL权限管理 - - 对设备、资源、类型进行鉴权 + - 对设备、资访问授权 +19. 认证模块 + - 支持http + - 支持匿名 + - 支持固定密码 + - 支持sql ## 尝试一下 @@ -58,9 +63,9 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) | 管理 | 说明 | 其他 | |----------------------------------------| ---- |---- | -| 113.90.145.99:18886 | mqtt端口 |用户名:smqtt 密码:smqtt | +| 113.90.145.99:18883 | mqtt端口 |用户名:smqtt 密码:smqtt | | 113.90.145.99:18888 | mqtt over websocket |用户名:smqtt 密码:smqtt | -| http://113.90.145.99:18887/smqtt/admin | 管理后台 |用户名:smqtt 密码:smqtt | +| http://113.90.145.99:60000/smqtt/admin | 管理后台 |用户名:smqtt 密码:smqtt | ## 商业化版本 如果遇到接入性能问题,或者需要定制化开发的,我们提供商业化版本出售,请添加微信17512575402! diff --git a/smqtt-bootstrap/src/test/java/ClusterNode1.java b/smqtt-bootstrap/src/test/java/ClusterNode1.java index 398d2513..a61473c0 100644 --- a/smqtt-bootstrap/src/test/java/ClusterNode1.java +++ b/smqtt-bootstrap/src/test/java/ClusterNode1.java @@ -1,4 +1,5 @@ import ch.qos.logback.classic.Level; +import io.github.quickmsg.common.config.AuthConfig; import io.github.quickmsg.common.config.BootstrapConfig; import io.github.quickmsg.common.config.SslContext; import io.github.quickmsg.core.Bootstrap; -- Gitee From 8360f59c12de27503afb3a15dbfa93a2787ae5eb Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 26 May 2022 22:59:37 +0800 Subject: [PATCH 27/28] 1.1.4 --- pom.xml | 2 +- smqtt-bootstrap/pom.xml | 10 +++++----- smqtt-common/pom.xml | 2 +- smqtt-core/pom.xml | 10 +++++----- smqtt-metric/pom.xml | 2 +- smqtt-metric/smqtt-metric-influxdb/pom.xml | 4 ++-- smqtt-metric/smqtt-metric-prometheus/pom.xml | 4 ++-- smqtt-persistent/pom.xml | 2 +- smqtt-persistent/smqtt-persistent-db/pom.xml | 6 +++--- smqtt-persistent/smqtt-persistent-redis/pom.xml | 6 +++--- smqtt-registry/pom.xml | 2 +- smqtt-registry/smqtt-registry-scube/pom.xml | 4 ++-- smqtt-rule/pom.xml | 2 +- smqtt-rule/smqtt-rule-dsl/pom.xml | 6 +++--- smqtt-rule/smqtt-rule-engine/pom.xml | 16 ++++++++-------- smqtt-rule/smqtt-rule-source/pom.xml | 4 ++-- .../smqtt-rule-source-db/pom.xml | 4 ++-- .../smqtt-rule-source-http/pom.xml | 6 +++--- .../smqtt-rule-source-kafka/pom.xml | 4 ++-- .../smqtt-rule-source-mqtt/pom.xml | 4 ++-- .../smqtt-rule-source-rabbitmq/pom.xml | 4 ++-- .../smqtt-rule-source-rocketmq/pom.xml | 4 ++-- smqtt-spring-boot-starter/pom.xml | 8 ++++---- smqtt-ui/pom.xml | 2 +- 24 files changed, 59 insertions(+), 59 deletions(-) diff --git a/pom.xml b/pom.xml index 0f3d1b38..b3874941 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 io.github.quickmsg smqtt - 1.1.3 + 1.1.4 smqtt-common smqtt-core diff --git a/smqtt-bootstrap/pom.xml b/smqtt-bootstrap/pom.xml index e5797431..f0d58b92 100644 --- a/smqtt-bootstrap/pom.xml +++ b/smqtt-bootstrap/pom.xml @@ -7,10 +7,10 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-bootstrap - 1.1.3 + 1.1.4 smqtt-bootstrap http://www.example.com @@ -45,17 +45,17 @@ io.github.quickmsg smqtt-core - 1.1.3 + 1.1.4 smqtt-registry-scube io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-ui io.github.quickmsg - 1.1.3 + 1.1.4 diff --git a/smqtt-common/pom.xml b/smqtt-common/pom.xml index b4cd5cfc..48321198 100644 --- a/smqtt-common/pom.xml +++ b/smqtt-common/pom.xml @@ -5,7 +5,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 jar diff --git a/smqtt-core/pom.xml b/smqtt-core/pom.xml index 1e999a87..22f6b5a7 100644 --- a/smqtt-core/pom.xml +++ b/smqtt-core/pom.xml @@ -5,7 +5,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 smqtt-core @@ -14,22 +14,22 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-rule-dsl - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-metric-influxdb - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-metric-prometheus - 1.1.3 + 1.1.4 diff --git a/smqtt-metric/pom.xml b/smqtt-metric/pom.xml index 1a20df7d..88db2918 100644 --- a/smqtt-metric/pom.xml +++ b/smqtt-metric/pom.xml @@ -8,7 +8,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-metric diff --git a/smqtt-metric/smqtt-metric-influxdb/pom.xml b/smqtt-metric/smqtt-metric-influxdb/pom.xml index 7dcf1032..6fd7cdff 100644 --- a/smqtt-metric/smqtt-metric-influxdb/pom.xml +++ b/smqtt-metric/smqtt-metric-influxdb/pom.xml @@ -5,7 +5,7 @@ smqtt-metric io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 @@ -15,7 +15,7 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 diff --git a/smqtt-metric/smqtt-metric-prometheus/pom.xml b/smqtt-metric/smqtt-metric-prometheus/pom.xml index fd384860..47c91c44 100644 --- a/smqtt-metric/smqtt-metric-prometheus/pom.xml +++ b/smqtt-metric/smqtt-metric-prometheus/pom.xml @@ -5,7 +5,7 @@ smqtt-metric io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 @@ -19,7 +19,7 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 diff --git a/smqtt-persistent/pom.xml b/smqtt-persistent/pom.xml index 76e563db..c3a41482 100644 --- a/smqtt-persistent/pom.xml +++ b/smqtt-persistent/pom.xml @@ -5,7 +5,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 pom diff --git a/smqtt-persistent/smqtt-persistent-db/pom.xml b/smqtt-persistent/smqtt-persistent-db/pom.xml index f801dbf9..380551f2 100644 --- a/smqtt-persistent/smqtt-persistent-db/pom.xml +++ b/smqtt-persistent/smqtt-persistent-db/pom.xml @@ -5,12 +5,12 @@ smqtt-persistent io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 smqtt-persistent-db - 1.1.3 + 1.1.4 3.14.11 @@ -20,7 +20,7 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 compile diff --git a/smqtt-persistent/smqtt-persistent-redis/pom.xml b/smqtt-persistent/smqtt-persistent-redis/pom.xml index f6f890c7..eff5c0c6 100644 --- a/smqtt-persistent/smqtt-persistent-redis/pom.xml +++ b/smqtt-persistent/smqtt-persistent-redis/pom.xml @@ -5,12 +5,12 @@ smqtt-persistent io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 smqtt-persistent-redis - 1.1.3 + 1.1.4 3.15.6 @@ -20,7 +20,7 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 compile diff --git a/smqtt-registry/pom.xml b/smqtt-registry/pom.xml index 9524f5a3..1f824b99 100644 --- a/smqtt-registry/pom.xml +++ b/smqtt-registry/pom.xml @@ -5,7 +5,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 pom diff --git a/smqtt-registry/smqtt-registry-scube/pom.xml b/smqtt-registry/smqtt-registry-scube/pom.xml index 86f410a9..4436c116 100644 --- a/smqtt-registry/smqtt-registry-scube/pom.xml +++ b/smqtt-registry/smqtt-registry-scube/pom.xml @@ -5,7 +5,7 @@ smqtt-registry io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 smqtt-registry-scube @@ -50,7 +50,7 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 provided diff --git a/smqtt-rule/pom.xml b/smqtt-rule/pom.xml index c5765aac..2a0e4511 100644 --- a/smqtt-rule/pom.xml +++ b/smqtt-rule/pom.xml @@ -7,7 +7,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-rule diff --git a/smqtt-rule/smqtt-rule-dsl/pom.xml b/smqtt-rule/smqtt-rule-dsl/pom.xml index bd20d2d8..9f2740ad 100644 --- a/smqtt-rule/smqtt-rule-dsl/pom.xml +++ b/smqtt-rule/smqtt-rule-dsl/pom.xml @@ -5,7 +5,7 @@ smqtt-rule io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 @@ -15,13 +15,13 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 provided smqtt-rule-engine io.github.quickmsg - 1.1.3 + 1.1.4 diff --git a/smqtt-rule/smqtt-rule-engine/pom.xml b/smqtt-rule/smqtt-rule-engine/pom.xml index a23e9cfb..46a18b11 100644 --- a/smqtt-rule/smqtt-rule-engine/pom.xml +++ b/smqtt-rule/smqtt-rule-engine/pom.xml @@ -7,7 +7,7 @@ smqtt-rule io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-rule-engine @@ -18,44 +18,44 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 provided io.github.quickmsg smqtt-rule-source-kafka - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-rule-source-http - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-rule-source-rocketmq - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-rule-source-rabbitmq - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-rule-source-db - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-rule-source-mqtt - 1.1.3 + 1.1.4 diff --git a/smqtt-rule/smqtt-rule-source/pom.xml b/smqtt-rule/smqtt-rule-source/pom.xml index 95886a06..86501650 100644 --- a/smqtt-rule/smqtt-rule-source/pom.xml +++ b/smqtt-rule/smqtt-rule-source/pom.xml @@ -8,7 +8,7 @@ smqtt-rule io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-rule-source @@ -33,7 +33,7 @@ io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 provided diff --git a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-db/pom.xml b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-db/pom.xml index a49e6fb1..71d190c8 100644 --- a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-db/pom.xml +++ b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-db/pom.xml @@ -5,13 +5,13 @@ smqtt-rule-source io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 io.github.quickmsg smqtt-rule-source-db - 1.1.3 + 1.1.4 3.14.11 diff --git a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-http/pom.xml b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-http/pom.xml index 6442de0e..222de62b 100644 --- a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-http/pom.xml +++ b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-http/pom.xml @@ -6,7 +6,7 @@ io.github.quickmsg smqtt-rule-source-http - 1.1.3 + 1.1.4 smqtt-rule-source-http @@ -15,14 +15,14 @@ smqtt-rule-source io.github.quickmsg - 1.1.3 + 1.1.4 io.github.quickmsg smqtt-common - 1.1.3 + 1.1.4 provided diff --git a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-kafka/pom.xml b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-kafka/pom.xml index a179c0f6..4702acff 100644 --- a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-kafka/pom.xml +++ b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-kafka/pom.xml @@ -5,12 +5,12 @@ smqtt-rule-source io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 smqtt-rule-source-kafka - 1.1.3 + 1.1.4 https://github.com/quickmsg/smqtt diff --git a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-mqtt/pom.xml b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-mqtt/pom.xml index 803c5b8e..515f5fd7 100644 --- a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-mqtt/pom.xml +++ b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-mqtt/pom.xml @@ -5,13 +5,13 @@ smqtt-rule-source io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 io.github.quickmsg smqtt-rule-source-mqtt - 1.1.3 + 1.1.4 diff --git a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rabbitmq/pom.xml b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rabbitmq/pom.xml index c7277129..597b6314 100644 --- a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rabbitmq/pom.xml +++ b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rabbitmq/pom.xml @@ -5,13 +5,13 @@ smqtt-rule-source io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 io.github.quickmsg smqtt-rule-source-rabbitmq - 1.1.3 + 1.1.4 diff --git a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rocketmq/pom.xml b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rocketmq/pom.xml index 7392fded..4e541867 100644 --- a/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rocketmq/pom.xml +++ b/smqtt-rule/smqtt-rule-source/smqtt-rule-source-rocketmq/pom.xml @@ -5,13 +5,13 @@ smqtt-rule-source io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 io.github.quickmsg smqtt-rule-source-rocketmq - 1.1.3 + 1.1.4 diff --git a/smqtt-spring-boot-starter/pom.xml b/smqtt-spring-boot-starter/pom.xml index 834e5965..6783cfc5 100644 --- a/smqtt-spring-boot-starter/pom.xml +++ b/smqtt-spring-boot-starter/pom.xml @@ -7,7 +7,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-spring-boot-starter @@ -34,17 +34,17 @@ io.github.quickmsg smqtt-core - 1.1.3 + 1.1.4 smqtt-registry-scube io.github.quickmsg - 1.1.3 + 1.1.4 smqtt-ui io.github.quickmsg - 1.1.3 + 1.1.4 io.projectreactor.netty diff --git a/smqtt-ui/pom.xml b/smqtt-ui/pom.xml index 933538c7..3b67b5e4 100644 --- a/smqtt-ui/pom.xml +++ b/smqtt-ui/pom.xml @@ -5,7 +5,7 @@ smqtt io.github.quickmsg - 1.1.3 + 1.1.4 4.0.0 smqtt-ui -- Gitee From 5afd3310711c7f9a64e5cf4b24a3f023b85e9f16 Mon Sep 17 00:00:00 2001 From: luxurong <1074455781@qq.com> Date: Thu, 26 May 2022 23:10:19 +0800 Subject: [PATCH 28/28] 1.1.4 --- README.md | 2 +- .../java/io/github/quickmsg/common/metric/MetricManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 939dc033..0c4fedc4 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ SMQTT基于reactor-netty(spring-webflux底层依赖) | 管理 | 说明 | 其他 | |----------------------------------------| ---- |---- | -| 113.90.145.99:18883 | mqtt端口 |用户名:smqtt 密码:smqtt | +| 113.90.145.99:18885 | mqtt端口 |用户名:smqtt 密码:smqtt | | 113.90.145.99:18888 | mqtt over websocket |用户名:smqtt 密码:smqtt | | http://113.90.145.99:60000/smqtt/admin | 管理后台 |用户名:smqtt 密码:smqtt | ## 商业化版本 diff --git a/smqtt-common/src/main/java/io/github/quickmsg/common/metric/MetricManager.java b/smqtt-common/src/main/java/io/github/quickmsg/common/metric/MetricManager.java index ea05e594..4519c81e 100644 --- a/smqtt-common/src/main/java/io/github/quickmsg/common/metric/MetricManager.java +++ b/smqtt-common/src/main/java/io/github/quickmsg/common/metric/MetricManager.java @@ -38,7 +38,7 @@ public interface MetricManager { MemoryMXBean mxb = ManagementFactory.getMemoryMXBean(); ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean(); - metrics.put("smqtt", "1.1.1"); + metrics.put("smqtt", "1.1.4"); metrics.put("start_time", sdf.format(new Date(runtimeBean.getStartTime()))); metrics.put("jdk_home", props.getProperty("java.home")); metrics.put("jdk_version", props.getProperty("java.version")); -- Gitee