2010-02-18 2 views
0

Я разрабатываю веб-приложение с помощью Grails и используя Grails LDAP в качестве механизма аутентификации. Тем не менее, я всегда получаю следующее сообщение об ошибке:Ошибка аутентификации в Grails LDAP

{Error 500: Cannot pass null or empty values to constructor Servlet: default URI: /ldap-app/j_spring_security_check Exception Message: Cannot pass null or empty values to constructor Caused by: Cannot pass null or empty values to constructor Class: GrailsAuthenticationProcessingFilter }

Мой файл SecurityConfig.groovy является:

security { 
    // see DefaultSecurityConfig.groovy for all settable/overridable properties 
    active = true 
    loginUserDomainClass = "User" 
    authorityDomainClass = "Role" 
    requestMapClass = "Requestmap" 

    useLdap = true 
    ldapRetrieveDatabaseRoles = false 
    ldapRetrieveGroupRoles = false 
    ldapServer = 'ldap://worf-mi.dapc.kao.au:389' 
    ldapManagerDn = 'CN=sa-ldap-its,OU=Unix Servers for Kerberos,OU=Information Technology Services,OU=Special Accounts,DC=nexus,DC=dpac,DC=cn' 
    ldapManagerPassword = 'Asdf1234' 
    ldapSearchBase = 'OU=People,DC=nexus,DC=dpac,DC=cn' 
    ldapSearchFilter = '(&(cn={0})(objectClass=user))' 
} 

ответ

0

я имел такую ​​же проблему и найти решение. Эта ошибка возникает, поскольку Acegi-Plugin пытается сохранить пароль Ldap-пользователей в пользовательском объекте. Фактически, в зависимости от настроек LDAP-сервера не разрешается извлекать пароль, поэтому для конструктора предоставляется пустое значение, как сообщает errormessage.

Исправление, которое я нашел, не очень приятно, но помогает подключить плагин. Вы должны изменить одно поле в следующем файле: ~/.grails // projects // plugins/acegi-0.5.3/src/java/org/codehaus/groovy/grails/plugins/springsecurity/GrailsUserImpl.java или на окнах: C:./Users // Grails // проекты // плагины/Acegi-0.5.3/SRC/Java/орг/Codehaus/заводной/Grails/плагины/springsecurity/GrailsUserImpl.java

Конструктор GrailsUserImpl() имеет следующее тело:

super(username, password, enabled, accountNonExpired, 
credentialsNonExpired, accountNonLocked, authorities); 

, который должен быть изменен на:

super(username, "", enabled, accountNonExpired, 
credentialsNonExpired, accountNonLocked, authorities); 

К сожалению, это нужно сделать для каждого клиента-разработчика и каждого нового проекта. Но он наконец-то запускает ldap auth.

Как я читал, они работают над этой ошибкой и пытаются исправить ее с помощью версии 0.6 плагина.

Надеюсь, что смогу помочь.

уш, Тим

1

У меня была такая же проблема, прочитайте решение выше и сделал что-то еще. Вместо изменения GrailsUserImpl.java я просто переключил пароль в пользовательской таблице с NULL на '' (пустая строка). Так как пароль не используется для LDAP, строка emptry будет передаваться (вместо значения NULL), которое имеет тот же самый эффект, как

super(username, "", enabled, accountNonExpired, 
credentialsNonExpired, accountNonLocked, authorities); 

, но это не влияет на исходный код. Это работало для моего проекта, надеюсь, что это тоже помогло.

Стивен

0

Просто добавьте "ldapUsePassword = ложь" в файле securityconfig:

Setting ldapUsePassword to false is important too. What we’re telling the Acegi plugin is not to extract the users password from Active Directory. If you don’t set this to false, you’ll get a lovely exception which isn’t particularly useful, java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor. What this is trying to tell you is that the users password is null, which is correct since the default setting for the Acegi plugin is to try to extract the users password from Active Directory, and we haven’t told Acegi what attribute Active Directory stores the password in. By setting ldapUsePassword to false, the plugin provides a bogus password for the user details, and we’re able to proceed without incident

Смежные вопросы