2012-03-12 3 views
2

Я пытаюсь получить доступ к моему проекту с помощью LDAP. Он запрашивает имя пользователя и пароль успешно, но при вводе правильных учетных данных в нем снова появляется всплывающее окно приглашения (кажется, что учетные данные неверны, но они не являются).Spring Security LDAP и MD5 хешированные пароли

Вот моя безопасность-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> 

Пароли хранятся в виде {MD5} хэш ... И я использую JSR 250 API.

EDIT: @TobyHobson это приводит к 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 положить password-compare вокруг password-encoder кажется компилировать, но он по-прежнему отвергает мои правильные учетные данные.

EDIT3: Вот необходимые журналы:

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: Я предполагаю, что это что-то делать с JSR 250 API и групп/ролей. Вот мой 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 

Я использовал @RolesAllowed({ Role.ROLE_ADMIN, Role.ROLE_MANAGER, Role.ROLE_VIEWER }) в моем контроллере и это моя абстрактная классовая роль:

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

Вы пишете, что «* Пароли хранятся в виде {MD5} хэш *». Вы имеете в виду, что в вашем файле конфигурации закодированный пароль передается серверу каталогов в запросе привязки? –

+0

пароли хранятся в виде хешей md5.он должен передать закодированный пароль на сервер, чтобы получить хорошее обратно - если учетные данные верны. я не хочу делать некоторые вещи, такие как проверка качества на стороне сервера - это только для входа ... – dtrunk

ответ

1

Вы должны добавить password encoder к провайдеру аутентификации сказать Spring хэш пароля перед привязкой к LDAP. например

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

Если вы используете соль, вам также необходимо включить это, например,

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

Обратите внимание: если сервер каталогов используется для проверки качества пароля и истории паролей, передача предварительно закодированных, - необратимый пароль сделает невозможным выполнение сервером вышеупомянутых проверок. –

+0

Неправильное использование. Стандартный пароль для паролей Spring Security MD5 несовместим с хэшами LDAP или аутентификацией связывания. –

+0

Я отдам Luke на этом ... –

0

Схема кодирования пароля несущественна при использовании аутентификации привязки, поскольку проверка пароля выполняется в каталоге, а не в коде Spring Security, поэтому Spring Security не имеет никакой необходимости хэширования пароля или иметь какие-либо знания о том, как он сохраняется. Он будет отправлен как открытый текст в каталог, поэтому вы должны использовать соединение ldaps, если вас это беспокоит.

Если вы проверяли подлинность с помощью операции сравнения «LDAP», вам пришлось бы отправить идентичную копию поля пароля в каталог. Это подвержено ошибкам, так как это зависит от правильности случая и т. Д. Существует также отсутствие поддержки хешей {MD5}, хотя есть LdapShaPasswordEncoder, который обрабатывает {SHA} и {SSHA}.

Скорее всего, ваша установка не работает по какой-либо другой причине, что должно быть ясно из-за более быстрого прекращения регистрации журналов отладки и журнала вашего LDAP-сервера.

+0

положить loglevel на 296 в slapd.conf, все, что я вижу в slapd.log, это '<= bdb_equality_candidates: (uid) не проиндексирован' – dtrunk

+0

Если у вас есть полный вход в систему slapd, тогда вы должны увидеть все до отказа от запроса привязки с DN, паролем и т. д. Также проверьте журнал отладки Spring Security. Пользователь не может быть найден с самого начала. –

1

Нет необходимости определять хэширование в файле конфигурации безопасности весны, метод хэширования будет обрабатываться самим ldap. только одна вещь, которую вы должны сделать, это хранить пароль MD5 в LDAP, как это ....

   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());