如何在Kafka中实现自定义主体构建器并使用ACL进行授权?

时间:2016-11-30 06:57:08

标签: apache-kafka

我已根据this documentation.为客户端和代理以及内部代理之间的所有通信启用了SSL身份验证 为了使用ACL进行授权,在文档中已经提到使用SSL身份验证时的默认主体名称,默认SSL用户名的格式为CN=writeuser,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown,要修改它,我们需要设置{{1 }}。

我想获得有关如何实现新PrincipalBuilderClass的帮助,并使用该类提供SSL用户名principal.builder.class=CustomizedPrincipalBuilderClass。显示上述示例实现的任何文章也有效。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

对于自定义 PrincipalBuilder,您需要实现 KafkaPrincipalBuilder 类。在该类中,您需要实现 build 方法,该方法基本上返回一个 KafkaPrincipal 实例。

对于示例实现,您可以按照以下步骤操作:https://github.com/kafka-security/oauth/blob/master/kafka-oauth/src/main/java/com/bfm/kafka/security/oauthbearer/CustomPrincipalBuilder.java

我正在复制代码的摘录,以防将来被删除/移动,

public class CustomPrincipalBuilder implements KafkaPrincipalBuilder {
    @Override
    public CustomPrincipal build(AuthenticationContext authenticationContext) throws KafkaException{
        try {
            CustomPrincipal customPrincipal;

            if (authenticationContext instanceof SaslAuthenticationContext) {
                SaslAuthenticationContext context = (SaslAuthenticationContext) authenticationContext;
                OAuthBearerTokenJwt token = (OAuthBearerTokenJwt) context.server()
                        .getNegotiatedProperty("OAUTHBEARER.token");

                customPrincipal = new CustomPrincipal("User", token.principalName());
                customPrincipal.setOauthBearerTokenJwt(token);

                return customPrincipal;
            } else {
                throw new KafkaException("Failed to build CustomPrincipal. SaslAuthenticationContext is required.");
            }
        } catch (Exception ex) {
            throw new KafkaException("Failed to build CustomPrincipal due to: ", ex);
        }
    }
}

上述示例使用 SASL OAUTHBEARER 进行身份验证/授权。但是您可以使用任何您想要的机制。