Главная > Soft > ClassCastException: com.sun.jndi.ldap.LdapCtx incompatible with org.springframework.ldap.core.DirContextAdapter

ClassCastException: com.sun.jndi.ldap.LdapCtx incompatible with org.springframework.ldap.core.DirContextAdapter

Наше jee приложение работает на WAS 6 и использует LDAP для авторизации. Работа с LDAP реализована с помощью стандартных классов Spring: BindAuthenticator и DefaultLdapAuthoritiesPopulator.

Схема классов в Spring

В этом году было  принято решение провести миграцию на WAS 8. И вот тут вылезла интересная проблема. Наш WA8 имеет версию 8.0.0 и собран в 2011 году. Проблема заключается в следующем: при авторизации вываливается Exception в DefaultLdapAuthoritiesPopulator, в месте, где идёт обращение в ldapTemplate-:

java.lang.ClassCastException: com.sun.jndi.ldap.LdapCtx incompatible with org.springframework.ldap.core.DirContextAdapter
at org.springframework.security.ldap.SpringSecurityLdapTemplate$2.mapFromContext(SpringSecurityLdapTemplate.java:154)
at org.springframework.ldap.core.ContextMapperCallbackHandler.getObjectFromNameClassPair(ContextMapperCallbackHandler.java:67)
at org.springframework.ldap.core.CollectingNameClassPairCallbackHandler.handleNameClassPair(CollectingNameClassPairCallbackHandler.java:50)

Самостоятельное копание показало, что пробела в InitialLdapContext. Почему-то он работает с default настройками, а не теми, которые указаны Spring’ом. Класс DefaultDirObjectFactory не применяется и не происходит преобразование DirContext  в DirContextAdapter.

В интернете предлагается workaround: заменить classloader нити выполнения на тот, который загружал contextsource, ldaptemplate и др.

ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();           Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
Object obj =  ldapTemplate.lookup(dn, ldapTemplate);
Thread.currentThread().setContextClassLoader(originalClassLoader);

К сожалению, применить его не получилось и пришлось продолжать миграцию с дальнейшими изменениями — использовать REST API.

Буду признателен, если напишете, как решали подобную проблему вы.

 

 

Categories: Soft Tags: , , ,
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.