我正在使用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))'
}
答案 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设置为 错误,该插件提供了一个虚假 用户详细信息的密码,和 我们能够顺利进行