3

我正在尝试在 tomcat 中设置两个领域,但由于某种原因它不允许我这样做。我想使用标准的 UserDatabaseRealm (conf/tomcat-users.xml) 来做管理工作(比如部署 webapps),但我想要一个自定义领域来为特定的 webapp 进行身份验证。

所以,我试着把它放在我的 webapp 的上下文中:

<Context>
  <GlobalNamingResources>
    <Resource name="CustomDatabase" auth="Container"
      type="org.apache.catalina.UserDatabase"
      description="User database that can be updated and saved"
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
      pathname="/usr/java/apache-tomcat-6.0.35/conf/tomcat-users.xml" 
    />
  </GlobalNamingResources>
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
    resourceName="CustomDatabase"
   />
</Context>

这实际上只是 server.xml 中的内容的副本,并进行了一些更改:

  • 名称从 UserDatabase 更改为 CustomDatabase。

  • 路径名是绝对路径名(与我用于主领域的相同)。

我总是遇到同样的错误:

LifecycleException:  No UserDatabase component found under key CustomDatabase

而且我不知道它在告诉我什么。它在谈论什么组件?

除了上面的上下文,我还尝试了其他一些方法,但它总是给出同样的错误:

  • 我尝试使用 GlobalNamingResources 标记包装资源以及是否存在相同的错误。

  • 我尝试将 Resource 的 auth 属性更改为 Container 和 Application 并得到相同的错误。

我错过了什么?谷歌的所有帮助主要是人们搞砸了他们的主要领域(我的很好)而不是试图配置第二个领域。

4

2 回答 2

11

您可以使用org.apache.catalina.realm.CombinedRealm. 从 Tomcat文档

<Realm className="org.apache.catalina.realm.CombinedRealm" >
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
         resourceName="UserDatabase"/>
  <Realm className="org.apache.catalina.realm.DataSourceRealm"
         dataSourceName="jdbc/authority"
         userTable="users" userNameCol="user_name" userCredCol="user_pass"
         userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>
于 2015-02-04T11:33:08.273 回答
1

所以,我没有真正的答案,但我会解释我做了什么。

我无法让第二个 UserDatabaseRealm 工作,但我真的只需要两个领域进行测试,而且类型无关紧要(最终,第二个领域将是 LDAP)。

所以我查看了可用的领域,并为我的次要测试领域选择了一个 MemoryRealm,它的工作原理与它应该有的一样。然后我把它变成了一个 LDAP 领域,它也工作得很好。

所以,对于那些真正需要两个 UserDatabaseRealms 的人,我很抱歉,我没有适合你的解决方案。

注意:很奇怪 UserDatabaseRealm 使用 JNDI 而 JNDIRealm 用于 LDAP(据我所知,不涉及 JDNI)。我确信这只是一些遗留命名问题,但它令人困惑。

于 2012-10-19T17:52:11.383 回答