我已经用ldap服务器配置了spring security(但是继续阅读,如果你不了解它也不是问题,这确实是一个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。但问题是,如果我从以下位置更改弹簧配置:
<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 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 服务器的最佳方法是什么?
编辑:这是由于设计选择不佳(查看接受的答案),在 jira 上打开了一个问题: https ://jira.springsource.org/browse/SEC-1966