跳到主要内容

二十九、RocketMQ源码分析 ACL实现机制


有关RocketMQ ACL的使用请查看上一篇《RocketMQ ACL使用指南》,本文从源码的角度,分析一下RocketMQ ACL的实现原理。

> 备注:RocketMQ在4.4.0时引入了ACL机制,本文代码基于RocketMQ4.5.0版本。

本节目录

  • 1、BrokerController#initialAcl

2、 PlainAccessValidator;

  • 2.1 类图
  • 2.1.2 PlainAccessResource类图
  • 2.2 构造方法
  • 2.3 parse方法
  • 2.4 validate 方法

3、 PlainPermissionLoader;

  • 3.1 类图
  • 3.2 PlainPermissionLoader构造方法
  • 3.3 load
  • 3.4 watch
  • 3.5 validate
  • 3.5.1 checkPerm

4、 AclClientRPCHook;

  • 4.1 doBeforeRequest

根据RocketMQ ACL使用手册,我们应该首先看一下Broker服务器在开启ACL机制时如何加载配置文件,并如何工作的。

1、BrokerController#initialAcl

Broker端ACL的入口代码为:BrokerController#initialAcl

private void initialAcl() {
if (!this.brokerConfig.isAclEnable()) { // @1
log.info("The broker dose not enable acl");
return;
}
List<AccessValidator> accessValidators = ServiceProvider.load(ServiceProvider.ACL_VALIDATOR_ID, AccessValidator.class); // @2
if (accessValidators == null || accessValidators.isEmpty()) {
log.info("The broker dose not load the AccessValidator");
return;
}
for (AccessValidator accessValidator: accessValidators) { // @3
final AccessValidator validator = accessValidator;
this.registerServerRPCHook(new RPCHook() {
@Override
public void doBeforeRequest(String remoteAddr, RemotingCommand request) {
//Do not catch the exception
validator.validate(validator.parse(request, remoteAddr)); // @4
}
@Override
public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) {
}
});
}