前言

到目前为止,已经介绍完了AdminClient中针对Topic的操作除了增删,查询功能,以及针对Topic的参数修改。本篇的主要内容是给与某一个账号相应的Topic赋权和删除权限等等,博主相信凡是大量给账号赋权的同学,一定会对赋权相当的厌恶。当然首先还是需要获取AdminClient,参考【Apache Kafka API AdminClient 获取对象】。更多内容请点击【Apache Kafka API AdminClient系列】。

赋予账号权限

首先介绍一下怎么赋权的,AdminClient中对这一块也有专门的方法: createAcls(Collection<AclBinding> acls)。最终封装成为CreateAclsResult对象,封装成***Result对象也是这一系列方法的老传统了。

kafka认证客户端 用户名 密码 kafkaadmin_Apache


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

AclBinding

kafka认证客户端 用户名 密码 kafkaadmin_kafka认证客户端 用户名 密码_02


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

ResourcePattern & PatternType

kafka认证客户端 用户名 密码 kafkaadmin_System_03


这里的参数ResourceTypePatternType都是枚举类型。ResourceType是选择执行范围的,在这里因为是要操作Topic,所以选择ResourceType.TOPIC就可以了,剩下的以后再介绍。PatternType则是选择操作类型的,我们这里选择LITERAL(显式),还有前缀型PREFIXED,匹配型MATCH,一般用不到。

最后剩下的就是String类型的了,这个就是要赋权的Topic名字,因此直接敲上去就可以了。

AccessControlEntry

kafka认证客户端 用户名 密码 kafkaadmin_Apache_04

接着要说的就是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的对象的集合。

kafka认证客户端 用户名 密码 kafkaadmin_封装_05

AclBindingFilter

kafka认证客户端 用户名 密码 kafkaadmin_封装_06


可以看到,这里和上面AclBinding基本上是一样的,没错,其实点进去ResourcePatternFilterAccessControlEntryFilter的用法也都是一模一样的,即便是源码也无非就是多了一些检测的内容。因此我们直接跳过贴上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();
    }
}