升级至Shibboleth IDP 5.x时自定义Mongo DataConnector配置报错排查
问题根因
Shibboleth 5.x升级后引入的LocalOnlyResourceEntityResolver会拦截带有classpath:/前缀的schema路径。Spring的Schema解析逻辑先判断文件后缀(XSD/DTD),再调用这个Resolver,而它只允许本地文件路径(file:协议)或无协议的相对路径,不接受classpath:/前缀的systemId,导致自定义XSD被误判为远程资源拦截。
解决方案
1. 修正spring.schemas映射逻辑(核心步骤)
现有spring.schemas配置是正确的,但要确保XML配置文件中使用命名空间URI而非直接引用XSD的classpath路径。比如在属性解析器配置XML里,应该声明命名空间:
<resolver:DataConnector xsi:type="uid:MongoDBConnector" ...>
其中uid对应的命名空间是http://dev.unitedid.org/NS/mongodb-connector,Spring会自动通过spring.schemas映射找到本地的schema/mongodb-connector.xsd,无需在XML里直接指定xsi:schemaLocation为classpath:/schema/mongodb-connector.xsd。
如果XML配置里显式写了指向classpath:/schema/mongodb-connector.xsd的xsi:schemaLocation,请删除该配置,改用命名空间映射。
2. 检查自定义组件的配置解析代码
确保UIDDataConnectorNamespaceHandler和对应的BeanDefinitionParser在处理配置时,没有硬编码classpath:/schema/mongodb-connector.xsd作为systemId。正确做法是让Spring通过命名空间URI自动关联到本地XSD,而非直接指定classpath路径。
3. 验证XSD文件的类路径位置
确认schema/mongodb-connector.xsd文件被正确打包到自定义组件的JAR中,路径与spring.schemas里的映射一致(即JAR根目录下的schema/mongodb-connector.xsd)。
备选方案:适配Shibboleth 5.x的EntityResolver逻辑
如果上述方法无效,可以尝试扩展或替换LocalOnlyResourceEntityResolver,允许classpath:协议的schema解析。但这种方法需要修改Shibboleth核心配置,不推荐作为首选方案。
是否需要弃用现有代码?
不需要立即弃用。上述配置调整应该能解决问题。如果后续维护成本过高,再考虑替换为官方提供的MongoDB DataConnector(若满足业务需求)。
内容的提问来源于stack exchange,提问作者Dave Rager

