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

Sai*_*dam 5 apache-kafka

根据本文档, 我已为客户端和代理之间以及代理间的所有通信启用 SSL 身份验证
对于使用 ACL 的授权,文档中已经提到使用 SSL 身份验证时的默认主体名称,默认 SSL 用户名将采用以下形式CN=writeuser,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown,要修改它,我们需要设置一个principal.builder.class=CustomizedPrincipalBuilderClass.

我想获得有关如何实现新的 PrincipalBuilderClass 并使用该类提供 SSL 用户名的帮助CN+OU。任何显示上述示例实现的文章也有效。

在此先感谢您的帮助!

Jah*_*hir 0

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

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

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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