我正在尝试在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标记包装资源以及是否存在相同的错误。
我尝试将资源的auth属性更改为Container和Application并获得相同的错误。
我错过了什么?谷歌的所有帮助主要是人们弄乱他们的主要领域(我的很好),而不是试图配置第二个领域。
答案 0 :(得分:7)
您可以使用org.apache.catalina.realm.CombinedRealm
。来自Tomcat documentation:
<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>
答案 1 :(得分:1)
所以,我没有真正的答案,但我会解释我做了什么。
我无法使第二个UserDatabaseRealm工作,但我真的只需要两个领域进行测试,并且它与类型无关(最终,第二个领域将是LDAP)。
因此,我正在查看可用的领域,并为我的辅助测试领域选择了一个MemoryRealm,它的工作原理应该如此。然后我把它变成了一个LDAP领域,并且工作正常。
所以,对于那些实际需要两个UserDatabaseRealms的人,很抱歉,我没有适合您的解决方案。
注意:奇怪的是UserDatabaseRealm使用JNDI而JNDIRealm用于LDAP(从我可以看出,JDNI不涉及)。我确信这只是一些传统的命名问题,但它令人困惑。