【问题标题】:ClassCastException while searching for LDAP user搜索 LDAP 用户时出现 ClassCastException
【发布时间】:2018-01-26 07:31:02
【问题描述】:

迁移到 Spring security 4.2.2(从 3.1)后,我在 LDAP 用户搜索中遇到以下错误:

java.lang.ClassCastException: com.sun.jndi.ldap.LdapCtx cannot be cast to org.springframework.ldap.core.DirContextAdapter
  at org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntryInternal(SpringSecurityLdapTemplate.java:345)
  at org.springframework.security.ldap.SpringSecurityLdapTemplate$3.executeWithContext(SpringSecurityLdapTemplate.java:318)
  at org.springframework.ldap.core.LdapTemplate.executeWithContext(LdapTemplate.java:817)
  at org.springframework.ldap.core.LdapTemplate.executeReadOnly(LdapTemplate.java:803)
  at org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntry(SpringSecurityLdapTemplate.java:316)
  at org.springframework.security.ldap.search.FilterBasedLdapUserSearch.searchForUser(FilterBasedLdapUserSearch.java:127)
  ...
  ...

对于解决问题的任何帮助,我将不胜感激。如果有什么不同,我正在使用 OpenLDAP 服务器进行测试。

谢谢, 拉古

【问题讨论】:

    标签: spring-security spring-ldap


    【解决方案1】:

    老问题,但我有同样的问题并设法以某种方式解决它,所以我想我应该分享一下。

    我正在使用 Spring Security 4.2.3 并且有类似的东西:

    public AdvisorResponse getAdvisorInfo(final String uid) {
        return cdsLdapTemplate.searchForObject(
                createCriteria(uid), this::mapAdvisorResponse
        );
    }
    
    private AdvisorResponse mapAdvisorResponse(final Object ctx) {
        final DirContextAdapter context = (DirContextAdapter) ctx;
        final AdvisorResponse advisor = new AdvisorResponse();
        advisor.setUid(context.getStringAttribute("uid"));
        return advisor;
    }
    
    private ContainerCriteria createCriteria(final String uid) {
        return query()
                .base("ou=people")
                .countLimit(1)
                .searchScope(SUBTREE)
                .timeLimit(TIMEOUT)
                .where("uid").is(uid);
    }
    

    它曾经完美地工作,直到我不得不在 @Async 线程中运行它,然后我开始出现相同的类转换异常。 正如here 建议的那样,错误似乎是由于线程中使用了不同的类加载器。我的解决方案是强制正确的类加载器进入执行线程:

    public AdvisorResponse getAdvisorInfo(final String uid) {
        Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
    
        return cdsLdapTemplate.searchForObject(
                createCriteria(uid), this::mapAdvisorResponse
        );
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 1970-01-01
      • 2023-03-06
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      相关资源
      最近更新 更多