我正在尝试将OAUTHBEARER实现为SASL机制。部分原因是我需要覆盖服务器和登录回调处理程序类。我使用docker,因此通过环境变量设置它们:
KAFKA_LISTENER_NAME_OUTSIDE_OAUTHBEARR_SASL_SERVER_CALLBACK_HANDLER_CLASS=[CLASS_NAME]
奇怪的是,它显然是在加载指定的类,就像我在所述类的构造函数中轻松地执行log.warn("ctor...")
一样。但是stacktrace显示它并没有调用所提供类的handle
方法,而是调用AbstractLogin$DefaultLoginHandler类:
[2021-11-23 17:41:57,137] WARN OAuthAuthenticateValidatorCallbackHandler - ctor: v1.1 (com.oauth2.security.oauthbearer.OAuthAuthenticateValidatorCallbackHandler) [2021-11-23 17:41:57,153] ERROR Unrecognized SASL Login callback (org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule) javax.security.auth.callback.UnsupportedCallbackException: Unrecognized SASL Login callback at org.apache.kafka.common.security.authenticator.AbstractLogin$DefaultLoginCallbackHandler.handle(AbstractLogin.java:105) at org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule.identifyToken(OAuthBearerLoginModule.java:316)
对于为什么它加载处理程序类而不使用它,有什么建议吗?如果我只是删除LOGIN/SERVER_CALLBACK_HANDLER_CLASS的环境变量,则会出现相同的Exception,但没有WARN来证明类已加载。我无法真正理解的一种可能性是,stacktrace似乎引用了LoginCallbackHandler,但调用的类是Server/ValidatorCallbackHandler;就好像它无法加载登录回调处理程序,只能加载Validator回调处理程序一样,但我仔细检查了a(环境变量是否属于正确的类名(login==login&&server==Validator(,以及类名是否确实正确。
当我向stackoverflow发帖时,会发生一些事情,答案会神奇地显现出来。
我需要做的是还包括另一个侦听器的SASL配置:
KAFKA_LISTENER_NAME_INSIDE_PLAIN_SASL_JAAS_CONFIG=";org.apache…">
然后它同时适用于INSIDE://PLAIN和OUTSIDE://OAUTHBEARER。