Xuân 3.1 Tomcat 6. *mùa xuân quá trình xác thực LDAP 3.1: "Credentials Bad" msg Khi Credentials Are Tốt
tôi đang làm việc trên thực hiện một webapp Xuân 3.1, chứng thực với LDAP.
Tôi đã kiểm tra thông tin đăng nhập LDAP (tên người dùng, mật khẩu, URL ldap, mẫu tìm kiếm) bằng chương trình Java theo kiểu JNDI tôi đã viết (được trích dẫn bên dưới). Chương trình đó đã hoạt động, đã đổ tất cả các thuộc tính của người dùng, bao gồm cả mật khẩu, dường như được mã hóa trên máy chủ LDAP.
Khi tôi cố đăng nhập bằng thông tin đăng nhập tương tự trong Spring 3.1, tôi nhận được thông báo lỗi "Bad Credentials".
tôi nhận được tin nhắn này trong các bản ghi:
DEBUG [org.springframework.security.authentication.ProviderManager:authenticate] (ProviderManager.java:152) - Authentication attempt using org.springframework.security.ldap.authentication.LdapAuthenticationProvider
DEBUG [org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider:authenticate] (AbstractLdapAuthenticationProvider.java:51) - Processing authentication request for user: John.A.Smith
DEBUG [org.springframework.security.ldap.authentication.BindAuthenticator:bindWithDn] (BindAuthenticator.java:108) - Attempting to bind as uid=John.A.Smith,ou=People,o=acme.com,o=acme.com
DEBUG [org.springframework.security.ldap.DefaultSpringSecurityContextSource$1:setupEnvironment] (DefaultSpringSecurityContextSource.java:76) - Removing pooling flag for user uid=John.A.Smith,ou=People,o=acme.com,o=acme.com
DEBUG [org.springframework.security.ldap.authentication.BindAuthenticator:handleBindException] (BindAuthenticator.java:152) - Failed to bind as uid=John.A.Smith,ou=People,o=acme.gov: org.springframework.ldap.AuthenticationException: [LDAP: error code 32 - No Such Object]; nested exception is javax.naming.AuthenticationException: [LDAP: error code 32 - No Such Object]
DEBUG [org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter:unsuccessfulAuthentication] (AbstractAuthenticationProcessingFilter.java:340) - Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Bad credentials
Trong * -security.xml của tôi, tôi đã cố gắng sử dụng các thẻ để thực hiện một so sánh mật khẩu và mã hóa xảy ra, nhưng nó đã không giúp đỡ. Tôi đã thử sử dụng md4, md5, plaintext, sha, sha-256, {ssha}, {sha} không có kết quả.
<s:authentication-manager>
<s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People,o=noaa.gov" >
<s:password-compare hash="md5">
<s:password-encoder hash="md5"/>
</s:password-compare>
</s:ldap-authentication-provider>
</s:authentication-manager>
Nhóm mạng của tôi là tổ chức quan trọng, chậm, quan liêu. Có cách nào tôi có thể nói những gì họ sử dụng mã hóa, nếu có, mà không cần liên lạc với họ?
Bất kỳ ý tưởng nào về những điều tôi có thể xem?
Đây là * -security.xml của tôi như là của nỗ lực cuối cùng của tôi và bản demo java LDAP tôi đã có thể kết nối với
Cảm ơn.
file * -security.xml của tôi:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:s="http://www.springframework.org/schema/security"
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-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<s:http auto-config="true" use-expressions="true">
**<s:intercept-url pattern="/welcome*" access="isAuthenticated()" />**
<s:form-login login-page="/login" default-target-url="/welcome"
authentication-failure-url="/loginfailed" />
<s:logout logout-success-url="/logout" />
</s:http>
<s:ldap-server url = "ldap://ldap-itc.sam.acme.com:636/o=acme.com"/>
<s:authentication-manager>
<s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People,o=noaa.gov" />
</s:authentication-manager>
</beans>
Đây là phong cách JNDI chương trình LDAP Java làm việc với các thông tin tương tự:
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;
import java.sql.*;
public class LDAPDEMO {
public static void main(String args[]) {
String lcf = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapurl = "ldap://ldap-itc.sam.acme.com:636/o=acme.com";
String loginid = "John.A.Smith";
String password = "passowordforjohn";
DirContext ctx = null;
Hashtable env = new Hashtable();
Attributes attr = null;
Attributes resultsAttrs = null;
SearchResult result = null;
NamingEnumeration results = null;
int iResults = 0;
env.put(Context.INITIAL_CONTEXT_FACTORY, lcf);
env.put(Context.PROVIDER_URL, ldapurl);
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid=" + loginid + ",ou=People,o=acme.com");
env.put(Context.SECURITY_CREDENTIALS, password);
try {
ctx = new InitialDirContext(env);
attr = new BasicAttributes(true);
attr.put(new BasicAttribute("uid",loginid));
results = ctx.search("ou=People",attr);
while (results.hasMore()) {
result = (SearchResult)results.next();
resultsAttrs = result.getAttributes();
for (NamingEnumeration enumAttributes = resultsAttrs.getAll(); enumAttributes.hasMore();) {
Attribute a = (Attribute)enumAttributes.next();
System.out.println("attribute: " + a.getID() + " : " + a.get().toString());
}// end for loop
iResults++;
}// end while loop
System.out.println("iResults == " + iResults);
}// end try
catch (Exception e) {
e.printStackTrace();
}
}// end function main()
}// end class LDAPDEMO
Solution
Nhận xét này từ Luke Taylor đã giúp tôi có được làm việc cấu hình của tôi:
cấu hình của bạn là sai ở chỗ bạn có "o = acme.com" trong URL máy chủ LDAP và cũng đang sử dụng " o = acme.com "trong mẫu DN của người dùng.
Tôi lấy mẫu "o = acme.com" ra khỏi mẫu DN và LDAP đã hoạt động. Ban đầu tôi đã đặt "o = acme.com" trong cả URL LDAP và mẫu DN vì tôi mới sử dụng Spring 3.1 và LDAP, và điều này tương tự như cách được thực hiện trong phiên bản Java JNDI của LDAP demo tôi đã viết dựa trên mã di sản mà tôi đang thay thế.
Đây là phiên bản hoạt động cuối cùng của * bảo mật của tôi.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:s="http://www.springframework.org/schema/security"
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-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<s:http auto-config="true" use-expressions="true">
**<s:intercept-url pattern="/welcome*" access="isAuthenticated()" />**
<s:form-login login-page="/login" default-target-url="/welcome"
authentication-failure-url="/loginfailed" />
<s:logout logout-success-url="/logout" />
</s:http>
<s:ldap-server url = "ldap://ldap-itc.sam.acme.com:636/o=acme.com"/>
<s:authentication-manager>
<s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People" />
</s:authentication-manager>
</beans>
Tôi sẽ khám phá nhận xét khác của anh ấy và xem liệu tôi có thể đặt lại mật khẩu hoặc nếu tôi cần.
Một lưu ý khác. Bạn không thể đặt mã hóa mật khẩu trở lại, vì bạn không biết thuật toán nào máy chủ đang sử dụng và thực tế nó có thể đang sử dụng nhiều hơn một thuật toán. Hashing mật khẩu là về bảo vệ cơ sở dữ liệu mật khẩu bằng cách làm cho nó khó đọc hơn. Nó không phải là về làm cho xác thực khách hàng an toàn hơn (bạn sẽ tìm thấy nhiều cuộc thảo luận về điều này trên SO). Nếu bạn muốn ngăn chặn nghe lén trên mạng từ ứng dụng của bạn đến máy chủ LDAP, thì việc sử dụng kết nối SSL có lẽ là tùy chọn đơn giản nhất. –