You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:07:32