Spring 安全 Active Directory 错误凭据处理(错误 49)
Spring Security Active Directory bad credentials handling (error 49)
我在简单的 Spring Web 应用程序中遇到 Active Directory 身份验证问题。我正在使用 ActiveDirectoryLdapAuthenticationProvider
,它似乎适用于空登录字段和正确的凭据。问题在于凭据无效(错误 login/pass 或两者兼而有之)。应用程序向浏览器抛出异常(错误 500):
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]
如果凭据不正确,Spring 是否应该将用户发送到身份验证失败-url?我没有任何 "manager" 帐户可用于 ldap BIND,我相信 ActiveDirectoryLdapAuthenticationProvider
应该使用登录表单中的凭据进行绑定。 Spring 文档没有任何关于绑定到 AD 的内容。
它可能可以使用自定义身份验证提供程序来解决,但我希望有一个开箱即用的解决方案。有一些类似的问题,但 none 非常精确或有任何有用的答案。
如何处理这个错误?
有没有办法在XML中配置它?也许,告诉 AD 提供商将绑定错误视为登录尝试失败?
自定义身份验证提供程序是唯一的解决方案吗?
spring-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>
编辑:一个丑陋的修复是覆盖ActiveDirectoryLdapAuthenticationProvider
并将throw LdapUtils.convertLdapException(e);
更改为throw badCredentials(e);
。
JBoss EAP 首字母存在问题 context.This 已在最新的 wildfly 中修复 versions.check 以下链接
我在简单的 Spring Web 应用程序中遇到 Active Directory 身份验证问题。我正在使用 ActiveDirectoryLdapAuthenticationProvider
,它似乎适用于空登录字段和正确的凭据。问题在于凭据无效(错误 login/pass 或两者兼而有之)。应用程序向浏览器抛出异常(错误 500):
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]
如果凭据不正确,Spring 是否应该将用户发送到身份验证失败-url?我没有任何 "manager" 帐户可用于 ldap BIND,我相信 ActiveDirectoryLdapAuthenticationProvider
应该使用登录表单中的凭据进行绑定。 Spring 文档没有任何关于绑定到 AD 的内容。
它可能可以使用自定义身份验证提供程序来解决,但我希望有一个开箱即用的解决方案。有一些类似的问题,但 none 非常精确或有任何有用的答案。
如何处理这个错误?
有没有办法在XML中配置它?也许,告诉 AD 提供商将绑定错误视为登录尝试失败?
自定义身份验证提供程序是唯一的解决方案吗?
spring-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>
编辑:一个丑陋的修复是覆盖ActiveDirectoryLdapAuthenticationProvider
并将throw LdapUtils.convertLdapException(e);
更改为throw badCredentials(e);
。
JBoss EAP 首字母存在问题 context.This 已在最新的 wildfly 中修复 versions.check 以下链接