2012-03-12 5 views
2

J'essaie d'accéder à mon projet en utilisant LDAP. Le nom d'utilisateur et le mot de passe vous sont demandés, mais les informations d'identification correctes provoquent une nouvelle fenêtre d'invite (il semble que les informations d'identification sont erronées, mais elles ne le sont pas).Printemps Sécurité LDAP et MD5 hashed mots de passe

Voilà ma sécurité context.xml:

<?xml version="1.0" encoding="utf-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
      xmlns:beans="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd 
           http://www.springframework.org/schema/security 
           http://www.springframework.org/schema/security/spring-security.xsd"> 

    <ldap-server url="ldap://${ldap.host}:${ldap.port}/${ldap.root}" manager-dn="${ldap.manager.dn}" manager-password="${ldap.manager.password}" /> 

    <authentication-manager> 
    <ldap-authentication-provider group-search-base="${ldap.group.search.base}" user-search-filter="(uid={0})" user-search-base="${ldap.user.search.base}" /> 
    </authentication-manager> 

    <http use-expressions="true"> 
    <intercept-url pattern="/**" /> 
    <http-basic /> 
    </http> 

</beans:beans> 

Les mots de passe sont stockés sous forme de hachage MD5 {} ... Et je suis en utilisant JSR 250 api.

EDIT: @TobyHobson il en résulte org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 38; cvc-complex-type.2.4.a: Invalid content was found starting with element 'password-encoder'. One of '{"http://www.springframework.org/schema/security":password-compare}' is expected.

EDIT2: @TobyHobson mettre password-compare autour password-encoder semble compiler, mais il rejette toujours mes lettres de créance correctes.

EDIT3: Voici les journaux nécessaires:

DEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'sessionFactory' 
DEBUG: org.springframework.security.web.FilterChainProxy - /licenses/index.html at position 1 of 8 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' 
DEBUG: org.springframework.security.web.context.HttpSessionSecurityContextRepository - HttpSession returned null object for SPRING_SECURITY_CONTEXT 
DEBUG: org.springframework.security.web.context.HttpSessionSecurityContextRepository - No SecurityContext was available from the HttpSession: [email protected] A new one will be created. 
DEBUG: org.springframework.security.web.FilterChainProxy - /licenses/index.html at position 2 of 8 in additional filter chain; firing Filter: 'BasicAuthenticationFilter' 
DEBUG: org.springframework.security.web.authentication.www.BasicAuthenticationFilter - Basic Authentication Authorization header found for user 'demo_admin' 
DEBUG: org.springframework.security.authentication.ProviderManager - Authentication attempt using org.springframework.security.ldap.authentication.LdapAuthenticationProvider 
DEBUG: org.springframework.security.ldap.authentication.LdapAuthenticationProvider - Processing authentication request for user: demo_admin 
DEBUG: org.springframework.security.ldap.search.FilterBasedLdapUserSearch - Searching for user 'demo_admin', with user search [ searchFilter: '(uid={0})', searchBase: 'ou=people', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ] 
DEBUG: org.springframework.security.ldap.SpringSecurityLdapTemplate - Searching for entry under DN 'dc=ubuntu,dc=local', base = 'ou=people', filter = '(uid={0})' 
DEBUG: org.springframework.security.ldap.SpringSecurityLdapTemplate - Found DN: uid=demo_admin,ou=people 
DEBUG: org.springframework.security.ldap.authentication.PasswordComparisonAuthenticator - Performing LDAP compare of password attribute 'userPassword' for user 'uid=demo_admin,ou=people' 
DEBUG: org.springframework.security.web.authentication.www.BasicAuthenticationFilter - Authentication request for failed: org.springframework.security.authentication.BadCredentialsException: Bad credentials 
DEBUG: org.springframework.security.web.context.HttpSessionSecurityContextRepository - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession. 
DEBUG: org.springframework.security.web.context.SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed 

EDIT4: Je suppose qu'il a quelque chose à voir avec JSR 250 api et groupes/rôles. Voici mon LDIF:

dn: ou=people,dc=ubuntu,dc=local 
objectClass: organizationalUnit 
ou: people 

dn: uid=demo_admin,ou=people,dc=ubuntu,dc=local 
userPassword: {MD5}fe01ce2a7fbac8fafaed7c982a04e229 
objectClass: posixAccount 
objectClass: account 
homeDirectory: null 
uid: demo_admin 
uidNumber: 1001 
gidNumber: 1000 
cn: Demo Admin 

dn: uid=demo_manager,ou=people,dc=ubuntu,dc=local 
userPassword: {MD5}fe01ce2a7fbac8fafaed7c982a04e229 
objectClass: posixAccount 
objectClass: account 
homeDirectory: null 
uid: demo_manager 
uidNumber: 2001 
gidNumber: 2000 
cn: Demo Manager 

dn: uid=demo_viewer,ou=people,dc=ubuntu,dc=local 
userPassword: {MD5}fe01ce2a7fbac8fafaed7c982a04e229 
objectClass: posixAccount 
objectClass: account 
homeDirectory: null 
uid: demo_viewer 
uidNumber: 3001 
gidNumber: 3000 
cn: Demo Viewer 

dn: ou=groups,dc=ubuntu,dc=local 
objectClass: organizationalUnit 
ou: groups 

dn: cn=Admins,ou=groups,dc=ubuntu,dc=local 
objectClass: posixGroup 
cn: Admins 
gidNumber: 1000 

dn: cn=Managers,ou=groups,dc=ubuntu,dc=local 
objectClass: posixGroup 
cn: Managers 
gidNumber: 2000 

dn: cn=Viewers,ou=groups,dc=ubuntu,dc=local 
objectClass: posixGroup 
cn: Viewers 
gidNumber: 3000 

je @RolesAllowed({ Role.ROLE_ADMIN, Role.ROLE_MANAGER, Role.ROLE_VIEWER }) dans mon contrôleur et ceci est ma absract classe rôle:

public abstract class Role 
{ 
    public static final String ROLE_ADMIN = "Admins"; 
    public static final String ROLE_MANAGER = "Managers"; 
    public static final String ROLE_VIEWER = "Viewers"; 
} 
+0

Vous écrivez que les mots de passe « * sont stockés sous forme de {MD5} hachage * ». Voulez-vous dire que dans votre fichier de configuration, le mot de passe codé est transmis au serveur d'annuaire dans une demande de liaison? –

+0

les mots de passe sont stockés en tant que hachages md5.il devrait transmettre le mot de passe encodé au serveur pour obtenir un bon retour - si les informations d'identification sont correctes. Je ne veux pas faire des choses comme la vérification de la qualité côté serveur - c'est juste pour la connexion ... – dtrunk

Répondre

1

Vous devez ajouter un password encoder à votre fournisseur d'authentification pour dire Spring de hachage du mot de passe avant de se lier dans LDAP. par exemple.

<authentication-manager> 
    <ldap-authentication-provider group-search-base="${ldap.group.search.base}" user-search-filter="(uid={0})" user-search-base="${ldap.user.search.base}"> 
    <password-encoder hash="md5"/> 
    </ldap-authentication-provider> 
</authentication-manager> 

Si vous utilisez un sel, vous devez également inclure cette valeur par ex.

<password-encoder hash="md5"> 
    <salt-source user-property="username"/> 
</password-encoder> 
+1

Attention: si le serveur d'annuaire est utilisé pour vérifier la qualité du mot de passe et l'historique des mots de passe, transmettre un pré-encodé, non Un mot de passe irréversible rendra impossible au serveur d'effectuer les vérifications susmentionnées. –

+0

Ce n'est pas correct. L'encodeur de mot de passe Spring Security MD5 standard n'est pas compatible avec les hachages LDAP ou l'authentification par liaison. –

+0

Je m'en remettrai à Luke sur celui-ci ... –

0

Le schéma de codage de mot de passe est sans importance lors de l'authentification de liaison, car le contrôle de mot de passe est effectuée dans le répertoire, pas dans le code de sécurité du printemps, donc la sécurité du printemps n'a pas besoin de hachage du mot de passe ou avoir une connaissance de la façon dont il est stocké. Il sera envoyé en clair dans le répertoire, vous devriez donc utiliser une connexion ldaps si cela vous inquiète.

Si vous étiez en train d'authentifier en utilisant une opération "compare" LDAP, vous devrez alors envoyer une copie identique du champ mot de passe au répertoire. Ceci est sujet aux erreurs car cela dépend de la casse, etc. Il n'y a pas non plus de support courant pour les hachages {MD5}, bien qu'il y ait un LdapShaPasswordEncoder qui gère {SHA} et {SSHA}.

Il est probable que votre configuration échoue pour une autre raison, ce qui devrait être clair à partir d'une exmination plus précise des journaux de débogage et de votre journal du serveur LDAP.

+0

mettre loglevel sur 296 dans slapd.conf, tout ce que je peux voir dans slapd.log est '<= bdb_equality_candidates: (uid) non indexé' – dtrunk

+0

Si vous avez une connexion complète slapd alors vous devriez voir tout au unmarshalling de la demande de liaison avec le DN, le mot de passe, etc. Vérifiez également le journal de débogage Spring Security. L'utilisateur peut ne pas être trouvé pour commencer. –

1

Il n'est pas nécessaire de définir le hachage dans le fichier de configuration de sécurité de printemps, la technique de hachage sera gérée par ldap elle-même. La seule chose que vous devez faire est de stocker le mot de passe MD5 dans ldap comme celui-ci ....

   Attributes attrs = new BasicAttributes(); 
     BasicAttribute ocattr = new BasicAttribute("objectclass"); 
     ocattr.add("top"); 
     ocattr.add("person"); 
     ocattr.add("inetorgperson"); 
     ocattr.add("organizationalperson"); 
     attrs.put(ocattr); 
     attrs.put("sn",user.getName()); 
     attrs.put("userPassword","{MD5}"+user.getPassword()); 
Questions connexes