我正在尝试将LDAP配置为Pivotal中的JNDI资源

时间:2015-09-29 12:37:18

标签: spring-mvc ldap gson spring-ldap

我通过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());

这是我的问题。我不能用LdapContext LdapTemplate。它仅适用于LdapContextSource,我无法将LdapContext转换为LdapContextSource。我该怎么办 ?

抱歉我的英语不好。谢谢。

1 个答案:

答案 0 :(得分:0)

我在完全相同的情况下所做的是创建一个java.naming.spi.ObjectFactory子类,它使用LdapContextSource元素中给出的属性返回Resource个实例。您可以使用'java.naming.Context'中的标准LDAP JNDI属性或使用您自己的。

我唯一需要解决的问题是如何处理java.naming.security.authenticationjava.naming.security.protocol