Grails LDAP身份验证失败

时间:2010-02-18 04:04:20

标签: security spring authentication grails ldap

我正在使用Grails开发一个Web应用程序,并使用Grails LDAP作为我的身份验证机制。但是,我总是得到以下错误:

  

{错误500:无法将null或空值传递给构造函数   Servlet:默认   URI:/ ldap-app / j_spring_security_check   异常消息:无法将null或空值传递给构造函数   引发者:无法将null或空值传递给构造函数   类: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))'
}

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,请阅读上面的解决方案并做了其他事情。我只是将用户表中的密码从NULL切换为''(空字符串),而不是修改GrailsUserImpl.java。由于密码不用于LDAP,因此将传输emptry字符串(而不是NULL值),其效果与

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

但它不会影响源代码。这适用于我的项目,希望它也有帮助。

史蒂芬

答案 1 :(得分:0)

我遇到了同样的问题并找到了解决方案。 发生此错误,因为Acegi-Plugin尝试将Ldap-users密码存储到User-object中。 实际上,根据LDAP服务器的设置,不允许检索密码,因此构造函数会给出一个空值,如错误消息所示。

我找到的修复程序并不是很好,但有助于启动并运行插件。您必须更改以下文件中的一个字段: 〜/ .grails // //项目插件/ Acegi的-0.5.3 / src目录/ JAVA /组织/ Codehaus的/常规/ Grails的/插件/ springsecurity / GrailsUserImpl.java 或在Windows上: C:/用户// //的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。

正如我读到的那样,他们正在研究这个bug,并尝试用插件的0.6版修复它。

希望我能提供帮助。

BR, 添

答案 2 :(得分:0)

只需在securityconfig文件中添加“ldapUsePassword = false”:

  

将ldapUsePassword设置为false是   也很重要。我们在说什么   Acegi插件不是提取的   来自Active Directory的用户密码。   如果你没有把它设置为假,你会   得到一个可爱的例外而不是   特别有用,   java.lang.IllegalArgumentException异常:   无法传递null或空值   构造函数。这是想要的   告诉你是用户密码是   null,这是正确的,因为   Acegi插件的默认设置   是试图提取用户   来自Active Directory的密码,我们   没有告诉Acegi什么属性   Active Directory存储密码   通过将ldapUsePassword设置为   错误,该插件提供了一个虚假   用户详细信息的密码,和   我们能够顺利进行