如何在 Context xml 文件中的 Tomcat 中定义 UserDatabase?

How to define UserDatabase in Tomcat within a Context xml file?

我一直在尝试通过仅设置上下文文件来使用 Tomcat 配置设置身份验证。

给定以下 webapp 上下文文件 conf/Catalina/localhost/myapp.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource
      name="MyUserDatabase"
      auth="Container"
      type="org.apache.catalina.UserDatabase"
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
      pathname="conf/myapp-users.xml"
      />
  <Realm
      className="org.apache.catalina.realm.UserDatabaseRealm"
      resourceName="MyUserDatabase"
      />
</Context>

启动Tomcat时出现如下错误:

javax.naming.NameNotFoundException: Name [MyUserDatabase] is not bound in this Context. Unable to find [MyUserDatabase].

但是,如果我在 <GlobalNamingResources> 下的 server.xml 中定义 <Resource name="MyUserDatabase"...,它会按预期工作。 documentation for contexts 清楚地表明 <Resource> 元素在那里有效。

是否有一种特殊的方式来引用上下文文件中定义的资源?还是根本不可能?

以防万一,我正在处理 Tomcat 9.

您需要将 属性 localJndiResource="true" 添加到您的领域:

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
       resourceName="MyUserDatabase"
       localJndiResource="true"/>

没有这个 属性 Tomcat 在 <GlobalNamingResources> 中查找资源(参见 Tomcat documentation)。