2014-10-20 4 views
0

Я установил аутентификацию ldap, используя следующую конфигурацию. Мне нужен пользователь для аутентификации с использованием хранилища данных LDAP, и в этом я установил pwdMaxFailure равным 2.Ошибка безопасности аутентификации LDAP Spring - исключение аутентификации вместо блокировки паролем

Аутентификация работает правильно, но каждый раз, когда я вхожу в систему с неправильным паролем, я получаю следующее исключение вместо исключения блокировки паролем. Я не думаю, что Spring LDAP проверяет PwdPolicy (подсчет попыток пароля) при аутентификации пользователя.

ne = (javax.naming.AuthenticationException) javax.naming.AuthenticationException: [LDAP: error code 49 - INVALID_CREDENTIALS: Bind failed: ERR_229 Cannot authenticate user cn=admin,ou=users,o=organisation]

Мой файл LDIF является

dn: cn=admin,ou=users,o=organization objectClass: inetOrgPerson
objectClass: organizationalPerson objectClass: person objectClass: top cn: admin sn: Admin uid: admin userPassword:: e1NTSEF9bEtlTUNzLy9OK1JsV2hCWEM2U2ZZNDh0Lzd0OHBlbjFrdjkxN3c9P Q==
createTimestamp: 20141003000008.689Z creatorsName: 0.9.2342.19200300.100.1.1=admin,2.5.4.11=system entryCSN: 20141020004319.002000Z#000000#001#000000 entryDN: cn=admin,ou=users,o=organization entryParentId: 8204b2df-ff5a-413a-a063-4ac30d35bee4 entryUUID:: N2I1MTFlNjYtMDhjZS00YjA3LWIxYzItNTkyOTI3ZGE3ZTBi modifiersName: 0.9.2342.19200300.100.1.1=admin,2.5.4.11=system modifyTimestamp: 20141020004319.002Z pwdFailureTime: 20141020003207.120Z pwdHistory:: MjAxNDEwMDMwMDAwMDguNjgxWiMxLjMuNi4xLjQuMS4xNDY2LjExNS4xMjEuMS4
0MCM4I1lXUnRhVzQ9 pwdPolicySubentry: cn=default,ou=pwdPolicy,o=organization

dn: cn=default,ou=pwdPolicy,o=organization objectClass: device
objectClass: pwdPolicy objectClass: top cn: default
pwdAttribute: userPassword pwdExpireWarning: 3600 pwdGraceExpire: 1 pwdLockout: TRUE pwdLockoutDuration: 120 pwdMaxAge: 2592000
pwdMaxFailure: 2

И файл конфигурации пружины следующим

<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security"> 
 
    <authentication-provider ref="jdbcProviderManager" /> 
 
    <authentication-provider ref="ldapProviderManager" />  
 
</authentication-manager> 
 

 
<bean id="jdbcProviderManager" class="au.com.spring.handler.DBLoginAuthentication"> 
 
    <property name="userDetailsService" ref="daoAuthenticationProvider" /> 
 
</bean> 
 

 
<bean id="ldapProviderManager" class="au.com.spring.handler.LDAPLoginAuthentication"> 
 
    <property name="userDetailsService" ref="ldapAuthenticationProvider" /> 
 
</bean> 
 

 
<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
 
    <property name="userDetailsService" ref="JdbcUserDetailsManager" /> 
 
    <property name="passwordEncoder" ref="encoder" /> 
 
</bean> 
 

 
<bean id="ldapAuthenticationProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
 
    <constructor-arg> 
 
    <bean class="org.springframework.security.ldap.authentication.BindAuthenticator"> 
 
     <constructor-arg ref="contextSource" /> 
 
     <property name="userSearch" ref="ldapUserSearch" /> 
 
    </bean> 
 
    </constructor-arg> 
 
    <constructor-arg> 
 
    <bean class="au.com.spring.handler.CustomLDAPAuthoritiesPopulator"> 
 
     <constructor-arg ref="contextSource" /> 
 
     <constructor-arg value="${group.search}" /> 
 
     <property name="groupSearchFilter" value="${group.search.filter}" /> 
 
     <property name="groupRoleAttribute" value="${group.role.att}" /> 
 
     <property name="rolePrefix" value="ROLE_" /> 
 
     <property name="searchSubtree" value="true" /> 
 
     <property name="convertToUpperCase" value="true" /> 
 
    </bean> 
 
    </constructor-arg> 
 
    <property name="hideUserNotFoundExceptions" value="false" /> 
 
    <property name="useAuthenticationRequestCredentials" value="true" /> 
 
    <property name="userDetailsContextMapper" ref="inetOrgPersonContextMapper" /> 
 
</bean> 
 

 
<bean id="inetOrgPersonContextMapper" class="org.springframework.security.ldap.userdetails.InetOrgPersonContextMapper" /> 
 

 
<bean id="defaultLdapUsernameToDnMapper" class="org.springframework.security.ldap.DefaultLdapUsernameToDnMapper"> 
 
    <constructor-arg value="${users.search}" /> 
 
    <constructor-arg value="${uid.att}" /> 
 
</bean> 
 
<!--<bean id="authenticationSuccessListener" class="prpa.athos.security.listener.AuthenticationSuccessListener" />--> 
 

 
<!--<bean id="contextSource" class="org.springframework.security.ldap.ppolicy.PasswordPolicyAwareContextSource">--> 
 
<bean id="contextSource" class="org.springframework.security.ldap.ppolicy.PasswordPolicyAwareContextSource"> 
 
    <constructor-arg value="ldap://localhost:10389/o=organization" /> 
 
    <!--<property name=""/>--> 
 
</bean>

ответ

0

I'm getting the following exception instead of Password lock exception.

От LDAP password policy draft 10:

8.1.1. Fail if the account is locked

If the account is locked as specified in Section 7.1, the server fails the operation with an appropriate resultCode (i.e. invalidCredentials (49) in the case of a bind operation, compareFalse (5) in the case of a compare operation, etc.). The server MAY set the error: accountLocked (1) in the passwordPolicyResponse in the controls field of the message.

Так сервер LDAP правильно себя.

I don't think Spring LDAP is checking the PwdPolicy (Counting the password attempts) while authenticating the user

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

+0

Благодарим за быстрый ответ. После того как логин не смог создать контекст (с использованием неправильного пароля), в блоке catch класса PasswordPolicyAwareContextSource он вызывает PasswordPolicyControlExtractor.extractControl, где responseControl имеет значение null. Если не null, он проверяет, заблокирован ли ctrl. Не уверен, что я поступаю правильно, есть ли способ заставить responseControl не null. – Swathi

+0

Я ничего не знаю о Spring, но в LDAP вам нужно приложить «контроль запроса политики паролей» к запросу, чтобы получить ответ «контроль политики паролей» с ответом. – EJP

Смежные вопросы