Я попытался расширить класс JNDIRealm, чтобы сначала распечатать/получить пароль соединения, переопределив метод getPassword(), а затем используя метод getConnectionPassword. Однако он не работает и выдает другой набор ошибок.
Требование: расшифровать пароль на лету в теге области файла server.xml для Tomcat 9. Я могу сделать это для тега ресурса, используя BasicDataSourceFactory, но не для тега области. Примечание. Мне не нужна логика расшифровки, а только базовые функции для печати текущего пароля соединения и замены его расшифрованным паролем.
Под тегом Realm в Server.xml
***<Valve className = "org.apache.catalina.authenticator.BasicAuthenticator" changeSessionIdOnAuthentication = "false" />
<Realm className = "org.test.CustomJNDIRealm"
connectionURL = "ldap://ldap.TEST.com:3268"
authentication = "simple"
referrals = "follow"
connectionName = "SA-TEST-Archival"
connectionPassword = "encrypted_password"
roleSearchAsUser = "false"
userSearch = " (sAMAccountName = {0})"
userBase = "dc-test,dc=com"
userSubtree = "true"
roleSearch" (member = {0})"
roleName = "cn"
roleSubtree = "true"|
roleBase = "OU=Service Accounts, OU=Services, OU=TEST Resources,DC=TEST,DC=com"/>***
Ниже приведен класс Java, который компилируется в файл JAR и вставляется в папку Tomcat/lib.
import org.apache.catalina.realm.JNDIRealm;
import java.security.Principal;
import java.util.List;
public class CustomJNDIRealm extends JNDIRealm {
@Override
protected String getPassword (String username) {
//String password= super.getPassword (username);
String password = getConnectionPassword();
System.out.println("++++++The current password LDAP Realm Tag "+password);
return password;
}
}
Ошибка: Теперь я получаю такие ошибки, как «CombinedRealm, не настроенный с помощью CredentialHandler и SetPropetiesRule.begin Match… не удалось установить свойство для всех свойств внутри тега области».
Примечание. Это приложение разработано поставщиком, и мы не можем контролировать код приложения. Только у нас есть контроль над Tomcat, и нам нужно реализовать маскирование пароля при подключении LDAP в теге Realm.
Я нигде не настраивал JointRealm. Вот как это настроено в server.xml согласно нашей команде Active Directory. Они предоставили образец, мы поместили его туда, и он начал работать.
Вот ответ: проблема была решена путем переопределения метода setConnectionPassword, вместо этого я пытался ранее напрямую изменить конструктор и другие методы.
import org.apache.catalina.realm.JNDIRealm;
public class CustomJNDIRealm extends JNDIRealm {
@Override
protected void setConnectionPassword(String connectionPassword) {
String realmTagPassword = connectionPassword;
System.out.println(realmTagPassword);
return super.setConnectionPassword("newPassword);
}
}
Где вы настроили файл JointRealm. Почему перед объявлением вашего игрового мира стоит элемент Valve? Realm обычно настраивается внутри элемента Engine.