Я настроил spring безопасность с сервером ldap (но продолжайте читать, это не проблема, если вы не знаете об этом, это действительно проблема spring). Все работает как шарм. Вот строка, которую я использую для этого:
<ldap-server ldif="" root="" manager-dn="" manager-password="" url="" id="ldapServer" />
Если я заполню атрибуты ldif и root, он запустит встроенный сервер:
<ldap-server ldif="classpath://ldap.ldif" root="dc=springframework,dc=org" manager-dn="" manager-password="" url="" id="ldapServer" />
Если я заполню другие поля, он запустит удаленный сервер:
<ldap-server ldif="" root="" manager-dn="dc=admin,dc=springframeworg,dc=org" manager-password="password" url="ldap://myldapserver.com/dc=springframeworg,dc=org" id="ldapServer" />
Все эти вещи работают правильно. Теперь я хочу использовать механизм spring для загрузки таких параметров из файла свойств:
Итак, я заменяю значения атрибутов следующим образом:
<ldap-server ldif="${ldap.ldif.path}" root="${ldap.ldif.root}" manager-dn="${ldap.server.manager.dn}" manager-password="${ldap.server.manager.password}" url="${ldap.server.url}" id="ldapServer" />
и создайте файл свойств с помощью:
ldap.server.url=
ldap.server.manager.dn=
ldap.server.manager.password=
ldap.ldif.path=
ldap.ldif.root=
Теперь, забавная часть проблемы. Если я запишу в файл следующие свойства:
ldap.server.url=ldap://myldapserver.com/dc=springframeworg,dc=org
ldap.server.manager.dn=dc=admin,dc=springframeworg,dc=org
ldap.server.manager.password=password
ldap.ldif.path=
ldap.ldif.root=
Он запускает удаленный сервер, как ожидалось.
Если я заполню файл свойства следующим образом:
ldap.server.url=
ldap.server.manager.dn=
ldap.server.manager.password=
ldap.ldif.path= classpath:ldap.ldif
ldap.ldif.root= dc=springframeworg,dc=org
Он не запускается, жалуясь, что отсутствует ldap-url. Но проблема в том, что если я изменю конфигурацию spring:
<ldap-server ldif="${ldap.ldif.path}" root="${ldap.ldif.root}" manager-dn="${ldap.server.manager.dn}" manager-password="${ldap.server.manager.password}" url="${ldap.server.url}" id="ldapServer" />
to (просто удалив ссылку на переменную ${ldap.server.url})
<ldap-server ldif="${ldap.ldif.path}" root="${ldap.ldif.root}" manager-dn="${ldap.server.manager.dn}" manager-password="${ldap.server.manager.password}" url="" id="ldapServer" />
Он работает!
Мои, тем не менее, что spring не заменяет значение атрибута конфигурацией конфигурации, если этот пуст. Но я нахожу это странным.
Можете ли вы дать мне понять, что это понимать? И что лучше всего сделать для настройки моего ldap-сервера через файл свойств?
EDIT: это связано с плохим выбором дизайна (см. принятый ответ), проблема была открыта на jira: https://jira.springsource.org/browse/SEC-1966