配置集群连接后ActiveMQ Artemis自定义SecurityManager的authenticate方法未触发
我通过实现ActiveMQSecurityManager5接口在ActiveMQ Artemis中自定义了SecurityManager,用密码字段传递JWT Token实现客户端认证。未配置集群连接时认证功能正常,但配置集群连接后,自定义类重写的authenticate方法没被调用(artemis.log里看不到该方法的日志,但init方法日志正常)。奇怪的是用合法用户名密码时认证依然成功,这和我认为authenticate没被调用的假设矛盾,请问还需要做哪些配置?
自定义authenticate方法代码
@Override public Subject authenticate(String user, String password, RemotingConnection remotingConnection, String securityDomain) throws NoCacheLoginException { logger.info("authenticate(" + user + ", " + password + ", " + remotingConnection.getRemoteAddress() + ", " + securityDomain + ")"); Subject sub = null; try { sub = activeMQJAASSecurityManager.authenticate(user, password, remotingConnection, securityDomain); } catch(Exception ex) { logger.info(ex.getLocalizedMessage()); logger.info("EXCEPTION IN NORMAL AUTH"); } logger.info("sub is:"+sub); if(sub == null) { boolean isValid = false; try { isValid = IsValidJWTToken(password); } catch(Exception e) { logger.info("JWT Authentication Failed"); logger.error(e.getStackTrace().toString()); } if(isValid == true) { try { logger.info("validUser is : "+validUser); logger.info("validPassword is : "+validPassword); sub = activeMQJAASSecurityManager.authenticate(validUser, validPassword, remotingConnection, securityDomain); } catch(Exception ex) { logger.info("Second JAAS Authentication Failed"); } } } return sub; }
解决方案建议
检查集群连接的安全配置:集群间连接默认可能使用单独安全域或绕过自定义SecurityManager。确保
broker.xml中cluster-connection节点的security-domain与客户端使用的一致,且未配置allow-null-authentication="true"这类跳过认证的参数。确认SecurityManager全局生效:集群连接可能使用了内置JAAS认证而非自定义实现。检查
broker.xml中security-manager配置是否全局生效,避免集群连接相关配置单独指定其他SecurityManager或JAAS域。排查集群节点信任机制:ActiveMQ Artemis集群节点间默认可能启用信任模式,节点间连接直接通过认证,不走客户端认证流程。此时客户端认证成功可能是节点同步了认证状态,而非自定义
authenticate方法被调用。可尝试配置cluster-connection的trust-all="false",并确保集群连接凭据通过自定义认证逻辑。验证自定义SecurityManager的节点一致性:确保所有集群节点都正确加载了自定义类和配置,避免部分节点未使用自定义实现导致认证不一致。
检查JAAS配置覆盖问题:如果自定义SecurityManager依赖JAAS(代码中调用了
activeMQJAASSecurityManager.authenticate),集群配置可能覆盖JAAS域,导致直接走原生JAAS认证而非自定义逻辑。需确保JAAS配置在集群环境下一致,且自定义SecurityManager优先级高于默认JAAS认证。
内容的提问来源于stack exchange,提问作者Siva

