Tomcat的:自定义表单authenicator在Web应用程序,而不是作为一个独立的JAR模块

2019-08-07 17:36发布

我们的Web应用程序需要与内部的特定逻辑的自定义窗体身份验证。 当前的形式认证实施要求的认证模块,让我们称之为custom.auth.jar ,存在于%CATALINA_HOME%/lib的Web应用程序开始之前。 Web应用程序使用使用以下的自定义模块认证context.xml指令:

<Valve className="foo.bar.CustomAuth" characterEncoding="UTF-8"/>

据我了解Tomcat的需求,该模块, custom.auth.jar ,必须在Tomcat的lib的Web应用程序启动之前的目录,因为Web应用程序似乎并不需要与Web归档打包认证码-它总是试图找到它在%CATALINA_HOMA%/lib 。 否则,Web应用程序根本无法启动:

SEVERE: Parse error in context.xml for /webapp
java.lang.ClassNotFoundException: foo.bar.CustomAuth

由于认证业务逻辑和一些保护的具体情况,我们被迫推出某种形式的认证模块的版本,并检查其在web应用程序监听器版本 - 如果Web应用程序认定认证模块的版本不兼容(不检查在Tomcat的图书馆目录中提供的JAR文件 - 我们使用反射代替) - 它只是拒绝启动报告Web应用程序之间试图启动和认证模块的兼容性错误。 再次, 现有的认证器模块必须在指定context.xml

尽管它保护了不兼容的版本,这给一些大的困难,我们不能开始在同一个Tomcat实例相同应用的另一个版本,因为这两种应用需要不同版本的认证模块。 但是,可以在Tomcat的一个版本lib目录中。

我的问题是:是否有可能打包定制FormAuthenticator直接在不需要的单机版Web应用程序FormAuthenticator到Web应用程序之前加载正在启动? 这将允许启动Web应用程序的多个版本,因为我们希望和不碰%CATALINA_HOME%/lib都没有。

换句话说:我如何才能让Tomcat能够从它的首页库目录采取定制认证模块从Web应用程序,而不是? 谢谢。

Answer 1:

Valve类不能由web应用程序的类加载器加载。 看看回答这个问题。

作为一个可能的解决方案的版本问题,可以考虑通过重写CATLINA_BASE环境变量启动不同的Tomcat实例。 有独立的CATALINA_HOME和CATALINA_BASE运行在可以在Tomcat的分布发现RUNNING.txt文件中。 我还可以分享工作示例配置。



文章来源: Tomcat: Custom form authenicator in a web application, not as a stand-alone JAR module. Possible?