Tomcat 9中JASPIC ServerAuthModule如何读取jaspic-providers.xml属性?
Tomcat 9 JASPIC提供者属性在ServerAuthModule中的获取方案
问题描述
我正在使用Tomcat 9,在jaspic-providers.xml中配置了如下提供者:
<provider name="test-oauth" className="org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider" layer="HttpServlet" appContext="Catalina/localhost /" description="OAuth test"> <property name="org.apache.catalina.authenticator.jaspic.ServerAuthModule.1" value="com.oauth.OAuthServerAuthModule" /> <property name="clientid" value="abc123" /> <property name="clientsecret" value="xyz321" /> </provider>
我不清楚如何让我的ServerAuthModule获取这些属性。我有一个ServletContextListener,调用AuthConfigFactory factory = AuthConfigFactory.getFactory();时可以看到jaspic-providers.xml文件正在被处理。
看起来我需要在调用以下代码前从factory中获取属性:
factory.registerConfigProvider( new SimpleAuthConfigProvider(props, factory), "HttpServlet", null, "test" );
我无法找到从提供者中获取属性的方法,但如果在传入registerConfigProvider前硬编码属性,ServerAuthModule可以正常工作。
解决方案
1. 移除手动注册代码
Tomcat会自动读取jaspic-providers.xml中的配置并完成提供者注册,你不需要手动调用registerConfigProvider。这段代码会覆盖XML中已配置的提供者,导致属性无法传递,直接删除即可。
2. 在ServerAuthModule中通过initialize方法获取属性
你的OAuthServerAuthModule需要实现javax.security.auth.message.module.ServerAuthModule接口的initialize方法,该方法的options参数会自动包含jaspic-providers.xml中配置的所有属性:
@Override public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, Map<String, Object> options) { // 直接从options中提取配置属性 String clientId = (String) options.get("clientid"); String clientSecret = (String) options.get("clientsecret"); // 执行你的初始化逻辑 }
3. 验证配置
确保jaspic-providers.xml位于Tomcat的conf目录下,重启Tomcat后,ServerAuthModule初始化时就能获取到XML中配置的属性值。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

