Нужна помощь в настройке нескольких Realms в Tomcat

Я пытаюсь настроить два Realms в tomcat, и по какой-то причине это не позволяет мне. Я хотел бы использовать стандартную область UserDatabaseRealm (conf/tomcat-users.xml) для выполнения административных действий (например, развертывания веб-приложений), но мне нужна настраиваемая область для аутентификации для определенного веб-приложения.

Итак, я попытался поместить это в контекст моего веб-приложения:

<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 с парой изменений:

  • Имя изменено на CustomDatabase с UserDatabase.

  • Путь — это абсолютный путь (то же самое, что я использую для основной области).

Я всегда получаю ту же ошибку:

LifecycleException:  No UserDatabase component found under key CustomDatabase

И я не знаю, что это говорит мне. О каком компоненте идет речь?

Наряду с приведенным выше контекстом я пробовал еще пару вещей, но всегда выдает одну и ту же ошибку:

  • Я пробовал обернуть ресурс тегом GlobalNamingResources и определить, есть ли такая же ошибка.

  • Я попытался изменить атрибут аутентификации ресурса как на контейнер, так и на приложение и получил ту же ошибку.

Что мне не хватает? Вся помощь от Google в основном состоит в том, что люди портят свою основную область (у меня все в порядке), не пытаясь настроить вторую область.


person rjcarr    schedule 19.10.2012    source источник


Ответы (2)


Вы можете использовать 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>
person Peter Keller    schedule 04.02.2015

Итак, у меня нет реального ответа, но я объясню, что я сделал.

Мне не удалось заставить работать вторую UserDatabaseRealm, но мне действительно нужно было две области для тестирования, и это не имело значения типа (в конце концов, второй областью будет LDAP).

Итак, я просмотрел доступные области и выбрал MemoryRealm для своей вторичной тестовой области, и она работала так, как должна была. Затем я сделал его областью LDAP, и это тоже сработало.

Итак, извините тех, кому на самом деле нужно два UserDatabaseRealms, у меня нет для вас решения.

ПРИМЕЧАНИЕ. Странно, что UserDatabaseRealm использует JNDI, а JNDIRealm используется для LDAP (и, насколько я могу судить, JDNI не задействован). Я уверен, что это просто какая-то устаревшая проблема с именами, но это сбивает с толку.

person rjcarr    schedule 19.10.2012