前言
到目前为止,已经介绍完了AdminClient中针对Topic的操作除了增删,查询功能,以及针对Topic的参数修改。本篇的主要内容是给与某一个账号相应的Topic赋权和删除权限等等,博主相信凡是大量给账号赋权的同学,一定会对赋权相当的厌恶。当然首先还是需要获取AdminClient,参考【Apache Kafka API AdminClient 获取对象】。更多内容请点击【Apache Kafka API AdminClient系列】。
赋予账号权限
首先介绍一下怎么赋权的,AdminClient中对这一块也有专门的方法: createAcls(Collection<AclBinding> acls)。最终封装成为CreateAclsResult对象,封装成***Result对象也是这一系列方法的老传统了。

我们还是先看这个方法,这个方法接收的对象是一个泛型为AclBinding的集合。所以我们去探究一下什么是AclBinding。
AclBinding

从官网上看想要创建一个AclBinding,需要两个值一个是ResourcePattern,另一个是AccessControlEntry。不要看第一个,看第二个,第一个已经过时了。因此就需要继续深究ResourcePattern和AccessControlEntry是怎么创建的。
ResourcePattern & PatternType

这里的参数ResourceType和PatternType都是枚举类型。ResourceType是选择执行范围的,在这里因为是要操作Topic,所以选择ResourceType.TOPIC就可以了,剩下的以后再介绍。PatternType则是选择操作类型的,我们这里选择LITERAL(显式),还有前缀型PREFIXED,匹配型MATCH,一般用不到。
最后剩下的就是String类型的了,这个就是要赋权的Topic名字,因此直接敲上去就可以了。
AccessControlEntry

接着要说的就是AccessControlEntry。这个类的参数字面上也很好理解,如果经常用命令行的话这里面的参数基本没啥障碍。
- 第一个
String类型的参数就是你用的哪个账号的账号名字; - 第二个
String参数是给哪个host主机设置这个权限,一般都用*号表示,所有的都要。 - 第三个
AclOperation类型,就是你要赋值的权限,这个也是一个枚举类型,常见的有READ,WRITE,CREATE,DELETE,ALTER,DESCRIBE,ALL等等,对应不同的操作。 - 第四个
AclPermissionType也是一个枚举,用来认证是不是要给这个用户对应的权限,它的值有ALLOW,DENY,ANY,UNKNOWN。一般来说用到的就是ALLOW。如果选择DENY,何必还要用这个功能呢。
把这些组装在一起,构成了一个AclBinding,那么多个AclBinding组成一个集合,传入createAcls()方法就可以完成一系列赋权的操作了。
Sample
这个Sample以给固定账号一个Read权限,使其可以读取某个Topic中的内容,具体需求大家可以自由发挥。要注意到传入的ACL其实是一个集合,也就意味着可以用一个for循环,就完成批量的权限赋予。
public void createACL() {
//创建ResourcePattern
ResourcePattern resourcePattern = new ResourcePattern(ResourceType.TOPIC, "topicName", PatternType.LITERAL);
//创建AccessControlEntry
AccessControlEntry accessControlEntry=new AccessControlEntry("User:accountName","*", AclOperation.READ, AclPermissionType.ALLOW);
//绑定到AclBinding上
AclBinding aclBinding=new AclBinding(resourcePattern,accessControlEntry);
Collection<AclBinding> aclBindingCollection= new ArrayList<>();
aclBindingCollection.add(aclBinding); //添加到集合
CreateAclsResult aclResult = adminClient.createAcls(aclBindingCollection);
KafkaFuture<Void> result = aclResult.all();
try {
result.get(); //执行
if (result.isDone()){ //验证是否成功
System.out.println(result.toString());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
移除账号权限
移除账号权限的方法叫做deleteAcls(Collection<AclBindingFilter> filters),基本上和赋予权限的内容类似,这次需要创建的对象是一个叫做AclBindingFilter的对象的集合。

AclBindingFilter

可以看到,这里和上面AclBinding基本上是一样的,没错,其实点进去ResourcePatternFilter和AccessControlEntryFilter的用法也都是一模一样的,即便是源码也无非就是多了一些检测的内容。因此我们直接跳过贴上Sample。
Sample
这个Sample同样选择了移除一个固定账号一个ALL权限,使其不对某个topic进行任何的操作,同理这里也能够做成批量的移除操作。
public void deleteAcls() {
ResourcePatternFilter resourcePatternFilter = new ResourcePatternFilter(ResourceType.TOPIC, "topicName", PatternType.LITERAL);
AccessControlEntryFilter accessControlEntryFilter=new AccessControlEntryFilter("User:accountName","*", AclOperation.ALL, AclPermissionType.ALLOW);
AclBindingFilter aclBinding=new AclBindingFilter(resourcePatternFilter,accessControlEntryFilter);
Collection<AclBindingFilter> aclBindingCollection= new ArrayList<>();
aclBindingCollection.add(aclBinding);
DeleteAclsResult aclResult = adminClient.deleteAcls(aclBindingCollection);
KafkaFuture<Collection<AclBinding>> result = aclResult.all();
try {
result.get();
if (result.isDone()){
System.out.println(result.toString());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}

本文聚焦于Apache Kafka中给账号的Topic赋权和删除权限操作。先介绍赋权,涉及AclBinding、ResourcePattern、PatternType、AccessControlEntry等对象的创建与使用,可批量赋权;后说明移除权限,需创建AclBindingFilter对象集合,也能实现批量移除。
612





