我正在尝试将 LDAP 配置为 Pivotal 中的 JNDI 资源
I am trying to configure LDAP as JNDI Resource in Pivotal
我通过 ldap 身份验证获得了一些数据。我可以用这段代码正确地做到这一点。
List<Employees> emps=new ArrayList<Employees>();
String url = "ldap://xxx:389";
String base = "dc=xxx,dc=xxx,dc=xx";
String userDn = "username";
String password = "pass";
try {
LdapContextSource ctxSrc = new LdapContextSource();
ctxSrc.setUrl(url);
ctxSrc.setBase(base);
ctxSrc.setUserDn(userDn);
ctxSrc.setPassword(password);
ctxSrc.afterPropertiesSet();
LdapTemplate lt = new LdapTemplate(ctxSrc);
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass", "Person"));
List<String> list = lt.search("", filter.encode(), new ContactAttributeMapperJSON());
emps = new Gson().fromJson(list.toString(), new TypeToken<List<Employees>>() {
}.getType());
这段代码工作正常。但我想隐藏我的用户名并通过。所以我从 content.xml(Pivotal) 获取数据。这是我的 content.xml:
<Resource name="ldap/LdapResource" auth="Container"
type="javax.naming.ldap.LdapContext"
factory="xxx"
singleton="false"
java.naming.factory.initial="com.sun.jndi.ldap.LdapCtxFactory"
java.naming.provider.url="ldap://xx:389"
java.naming.security.authentication="simple"
java.naming.security.principal="username"
java.naming.security.credentials="pass." />
还有我的新代码块:
List<Employees> emps = new ArrayList<Employees>();
try {
Context initialContext = new InitialContext();
LdapContext ldapContext = (LdapContext) initialContext.lookup("java:comp/env/ldap/LdapResource");
*LdapTemplate lt = new LdapTemplate(ldapContext);*
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass", "Person"));
List<String> list = lt.search("", filter.encode(), new ContactAttributeMapperJSON());
emps = new Gson().fromJson(list.toString(), new TypeToken<List<Employees>>() {
}.getType());
这是我的问题。我不能将 LdapTemplate 与 LdapContext 结合使用。它仅适用于 LdapContextSource,我无法将 LdapContext 转换为 LdapContextSource。我应该怎么办 ?
抱歉我的英语不好。谢谢。
我在完全相同的情况下所做的是创建一个 java.naming.spi.ObjectFactory
子类,该子类 returns 一个 LdapContextSource
实例使用 Resource
元素中给出的属性.您可以使用 'java.naming.Context' 中的标准 LDAP JNDI 属性或使用您自己的属性。
我唯一需要解决的问题是如何处理 java.naming.security.authentication
和 java.naming.security.protocol
。
我通过 ldap 身份验证获得了一些数据。我可以用这段代码正确地做到这一点。
List<Employees> emps=new ArrayList<Employees>();
String url = "ldap://xxx:389";
String base = "dc=xxx,dc=xxx,dc=xx";
String userDn = "username";
String password = "pass";
try {
LdapContextSource ctxSrc = new LdapContextSource();
ctxSrc.setUrl(url);
ctxSrc.setBase(base);
ctxSrc.setUserDn(userDn);
ctxSrc.setPassword(password);
ctxSrc.afterPropertiesSet();
LdapTemplate lt = new LdapTemplate(ctxSrc);
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass", "Person"));
List<String> list = lt.search("", filter.encode(), new ContactAttributeMapperJSON());
emps = new Gson().fromJson(list.toString(), new TypeToken<List<Employees>>() {
}.getType());
这段代码工作正常。但我想隐藏我的用户名并通过。所以我从 content.xml(Pivotal) 获取数据。这是我的 content.xml:
<Resource name="ldap/LdapResource" auth="Container"
type="javax.naming.ldap.LdapContext"
factory="xxx"
singleton="false"
java.naming.factory.initial="com.sun.jndi.ldap.LdapCtxFactory"
java.naming.provider.url="ldap://xx:389"
java.naming.security.authentication="simple"
java.naming.security.principal="username"
java.naming.security.credentials="pass." />
还有我的新代码块:
List<Employees> emps = new ArrayList<Employees>();
try {
Context initialContext = new InitialContext();
LdapContext ldapContext = (LdapContext) initialContext.lookup("java:comp/env/ldap/LdapResource");
*LdapTemplate lt = new LdapTemplate(ldapContext);*
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass", "Person"));
List<String> list = lt.search("", filter.encode(), new ContactAttributeMapperJSON());
emps = new Gson().fromJson(list.toString(), new TypeToken<List<Employees>>() {
}.getType());
这是我的问题。我不能将 LdapTemplate 与 LdapContext 结合使用。它仅适用于 LdapContextSource,我无法将 LdapContext 转换为 LdapContextSource。我应该怎么办 ?
抱歉我的英语不好。谢谢。
我在完全相同的情况下所做的是创建一个 java.naming.spi.ObjectFactory
子类,该子类 returns 一个 LdapContextSource
实例使用 Resource
元素中给出的属性.您可以使用 'java.naming.Context' 中的标准 LDAP JNDI 属性或使用您自己的属性。
我唯一需要解决的问题是如何处理 java.naming.security.authentication
和 java.naming.security.protocol
。