2010-02-18 3 views
0

Je développe une application web en utilisant Grails et en utilisant Grails LDAP comme mécanisme d'authentification. Cependant, je reçois toujours l'erreur suivante:Échec de l'authentification LDAP Grails

{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 }

Mon fichier SecurityConfig.groovy est:

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))' 
} 

Répondre

0

i eu le même problème et a trouvé une solution. Cette erreur se produit car le plug-in Acegi tente de stocker le mot de passe Ldap-users dans l'objet User. En fait, en fonction des paramètres du serveur LDAP, il n'est pas autorisé à récupérer le mot de passe, de sorte qu'une valeur vide est donnée au constructeur, comme l'indique le message d'erreur.

Le correctif que j'ai trouvé n'est pas vraiment sympa, mais aide à faire fonctionner le plugin. Vous devez modifier un champ dans le fichier suivant: ~/.grails // projets // plugins/acegi-0.5.3/src/java/org/codehaus/groovy/grails/plugins/springsecurity/GrailsUserImpl.java ou sur les fenêtres: C:./Users // // Grails projets // plugins/Acegi-0.5.3/src/java/org/Codehaus/groovy/Grails/plugins/springsecurity/GrailsUserImpl.java

Constructor GrailsUserImpl() a le corps suivant:

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

qui doit être modifiée:

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

Malheureusement, cela doit être fait pour chaque développeur-client et chaque nouveau projet. Mais il obtient enfin l'autorisation ldap. En lisant, ils travaillent sur ce bogue et essaient de le réparer avec la version 0.6 du plugin.

J'espère pouvoir vous aider.

br, Tim

1

J'ai eu le même problème, lisez la solution ci-dessus et a fait autre chose. Au lieu de modifier GrailsUserImpl.java, j'ai simplement changé le mot de passe de la table utilisateur de NULL à '' (chaîne vide). Étant donné que le mot de passe est utilisé pour LDAP, la chaîne de emptry sera transmis (au lieu de la valeur NULL) qui a le même effet que

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

mais il ne marche pas affecter le code source. Cela a fonctionné pour mon projet, j'espère que cela a aidé aussi.

Steven

0

Il suffit d'ajouter "ldapUsePassword = false" dans votre fichier 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