前言
到目前为止,已经介绍完了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();
}
}