从零开始实现 mq-13-注册鉴权 auth
注册鉴权
我们前面实现了 mq 的基本功能,不过还是存在一个问题,那就是 mq 没有进行鉴权。
这就会导致如果部署在公网,任何一个机器都可以连接我们的服务,这显然是不够安全的。
生产者实现
属性
生产者启动时新增 2 个属性:
/** * 账户标识 * @since 0.1.4 */ private String appKey; /** * 账户密码 * @since 0.1.4 */ private String appSecret;
注册逻辑调整
注册时,添加这两个属性到服务端。
public void registerToBroker() { int successCount = 0; for(RpcChannelFuture channelFuture : this.channelFutureList) { ServiceEntry serviceEntry = new ServiceEntry(); serviceEntry.setGroupName(groupName); serviceEntry.setAddress(channelFuture.getAddress()); serviceEntry.setPort(channelFuture.getPort()); serviceEntry.setWeight(channelFuture.getWeight()); BrokerRegisterReq brokerRegisterReq = new BrokerRegisterReq(); brokerRegisterReq.setServiceEntry(serviceEntry); brokerRegisterReq.setMethodType(MethodType.P_REGISTER); brokerRegisterReq.setTraceId(IdHelper.uuid32()); brokerRegisterReq.setAppKey(appKey); brokerRegisterReq.setAppSecret(appSecret); log.info("[Register] 开始注册到 broker:{}", JSON.toJSON(brokerRegisterReq)); final Channel channel = channelFuture.getChannelFuture().channel(); MqCommonResp resp = callServer(channel, brokerRegisterReq, MqCommonResp.class); log.info("[Register] 完成注册到 broker:{}", JSON.toJSON(resp)); if(MqCommonRespCode.SUCCESS.getCode().equals(resp.getRespCode())) { successCount++; } } if(successCount <= 0 && check) { log.error("校验 broker 可用性,可连接成功数为 0"); throw new MqException(MqCommonRespCode.P_REGISTER_TO_BROKER_FAILED); } }
消费者
消费者连接到 broker 也是类似的,此处不做赘述。
Broker 的处理
注册逻辑
以前注册是直接成功,此处加一个业务判断。
// 生产者注册 if(MethodType.P_REGISTER.equals(methodType)) { BrokerRegisterReq registerReq = JSON.parseObject(json, BrokerRegisterReq.class); if(!brokerRegisterValidService.producerValid(registerReq)) { log.error("{} 生产者注册验证失败", JSON.toJSON(registerReq)); throw new MqException(MqBrokerRespCode.P_REGISTER_VALID_FAILED); } return registerProducerService.register(registerReq.getServiceEntry(), channel); }
首先会校验有效性,这个是一个接口,可自行灵活替换。
其他业务逻辑
其他业务处理时,都需要 registerProducerService.checkValid(channelId);
进行有效性判断。
// 生产者注销 if(MethodType.P_UN_REGISTER.equals(methodType)) { registerProducerService.checkValid(channelId); BrokerRegisterReq registerReq = JSON.parseObject(json, BrokerRegisterReq.class); return registerProducerService.unRegister(registerReq.getServiceEntry(), channel); }
小结
注册鉴权实现的原理非常简单,不过可以为安全性提供最基础的保障。
希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。
我是老马,期待与你的下次重逢。
开源地址
「其他文章」
- 35岁危机?内卷成程序员代名词了…
- 在线文本实体抽取能力,助力应用解析海量文本数据
- 不买排名,不去SEO,如何做到登上谷歌搜索首页?
- HtmlParse:一款超轻量级的HTML文件解析和爬取工具
- 五款当下超火热的相亲交友APP测评
- 尽一份孝心,为家人做一个老人防摔报警系统
- 作为软件工程师,给年轻时的自己的建议(下)
- 技术分享| 浅谈调度平台设计
- 组态界面推陈出新:打造新一代再生水厂工艺二维组态系统
- 平头哥 芯事访谈 | 全志科技CTO丁然:视频、AI市场爆发,RISC-V生态需要产业一起努力
- IDEA SSM Maven实现商品管理系统(超详细SSM整合项目)
- 如何为回归测试选择测试用例?
- 前端必学——函数式编程(五)
- 40篇学完C语言——(第八篇)【指针数组以及指向指针的指针】
- 焱融看|非结构化数据场景下,数据湖到底有多香?
- 低代码开发的未来~
- Docker容器:将带UI的程序直接转为Web应用,so easy
- PHP 基于 SW-X 框架,搭建WebSocket服务器(二)
- 低代码开发的前后端联调——APICloud Studio 3 API管理工具结合数据云3.0使用教程
- 揭秘华为云GaussDB(for Influx)最佳实践:hint查询