У меня проблема с аутентификацией Active Directory в простом веб-приложении Spring. Я использую ActiveDirectoryLdapAuthenticationProvider
и, похоже, работает нормально для пустых полей входа и правильных учетных данных. Проблема заключается в недопустимых учетных данных (неверный логин/пароль или оба). Приложение выдает исключение (ошибка 500) в браузере:Весенняя безопасность Недействительные учетные данные Active Directory (ошибка 49)
Error processing request
Context Path: /MYAPPNAME
Servlet Path: /login_check
Path Info: null
Query String: null
Stack Trace:
org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: JBAS011843: Failed instantiate InitialContextFactory com.sun.jndi.ldap.LdapCtxFactory from classloader ModuleClassLoader for Module "deployment.MYAPPNAME.war:main" from Service Module Loader [Root exception is javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece]] (...)
ошибка консоли корень является:
javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308:
LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece]
Если учетные данные неверны, не всходит отправить пользователю аутентификации failure- URL? У меня нет учетной записи «manager» для использования ldap BIND, я считаю, что ActiveDirectoryLdapAuthenticationProvider
должен связываться с использованием учетных данных из формы входа. Весенняя документация не имеет ничего о привязке к AD.
Возможно, это может быть разрешено с использованием собственного поставщика аутентификации, но я надеялся, что есть готовое решение. Есть несколько подобных вопросов, но ни один из них не очень точен или с каким-либо полезным ответом.
Как подойти к этой ошибке?
Есть ли способ настроить его в XML? Возможно, сообщить провайдеру AD об ошибке привязки протектора как неудачной попытке входа в систему?
Является ли обычным поставщиком аутентификации единственным решением?
весна-security.xml
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter">
<property name="rolePrefix" value="" />
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<constructor-arg name="decisionVoters" ref="roleVoter" />
</bean>
<s:http authentication-manager-ref="ldap-auth" access-decision-manager-ref="accessDecisionManager" use-expressions="false">
<s:intercept-url pattern="/list**" access="ADGROUP-XYZ" />
<s:form-login
login-page="/login"
login-processing-url="/login_check"
username-parameter="username"
password-parameter="password"
default-target-url="/list"
authentication-failure-url="/login?fail" />
<s:logout
invalidate-session="true"
logout-success-url="/login?logout"
logout-url="/logout"
delete-cookies="JSESSIONID" />
<s:csrf />
</s:http>
<s:authentication-manager id="ldap-auth">
<s:authentication-provider ref="adAuthenticationProvider" />
</s:authentication-manager>
<bean id="adAuthenticationProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
<constructor-arg value="company.local" />
<constructor-arg value="ldap://server.company.local:389/" />
<property name="useAuthenticationRequestCredentials" value="true"/>
<property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>
EDIT: Один некрасиво исправление переопределить ActiveDirectoryLdapAuthenticationProvider
и изменить throw LdapUtils.convertLdapException(e);
к throw badCredentials(e);
.
вы можете попробовать образцы код, приведенный в url https://jira.spring.io/browse/SEC-2754, чтобы исправить эту проблему – Sampathkumar