我有一个 Spring MVC 应用程序(使用 3.0.5 版本),并且需要使用 Spring LDAP 绑定到 Active Directory,以便简单且仅验证用户的凭据。该应用程序托管在 Linux 服务器上,因此我需要一个跨平台的解决方案。并且该应用程序不使用 Spring Security。
在此设置中实施用户身份验证的有效方法是什么?Active Directory 支持FastBind
控制 (id= 1.2.840.113556.1.4.1781
),所以我想利用它,因为我只需要验证输入凭据,不需要从 AD 返回其他信息。
谢谢!
更新(2012 年 7 月 16 日):我将继续更新我的问题,提供解决方案的详细信息。
根据@ig0774 的回答,我编写了以下connection control
课程:
package com.company.authentication;
import javax.naming.ldap.Control;
public class FastBindConnectionControl implements Control {
@Override
public String getID() {
return "1.2.840.113556.1.4.1781";
}
@Override
public boolean isCritical() {
return true;
}
@Override
public byte[] getEncodedValue() {
return null;
}
}
然后,我扩展AbstractContextSource
了,使用FastBind
连接控制类:
package com.company.authentication;
import java.util.Hashtable;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import org.springframework.ldap.core.support.AbstractContextSource;
public class FastBindActiveDirectoryContextSource extends AbstractContextSource {
@Override
protected DirContext getDirContextInstance(Hashtable env) throws NamingException {
return new InitialLdapContext(env, new Control[] { new FastBindConnectionControl() });
}
}
最后,一个服务类来封装认证机制:
package com.company.authentication;
import javax.naming.AuthenticationException;
import javax.naming.directory.DirContext;
import org.springframework.ldap.core.ContextSource;
import org.springframework.ldap.support.LdapUtils;
public class ActiveDirectoryAuthService implements IAuthenticate {
private ContextSource contextSource;
public void setContextSource(ContextSource contextSource) {
this.contextSource = contextSource;
}
@Override
public boolean authenticate(final String login, String password) {
try {
DirContext ctx = contextSource.getContext(login, password);
LdapUtils.closeContext(ctx);
return true;
}
catch (Exception e) {
return false;
}
}
}
在我的 Spring 应用程序上下文配置文件中,我添加了以下内容:
<bean id="ADContextSource" class="com.company.authentication.FastBindActiveDirectoryContextSource">
<property name="url" value="ldaps://x.x.x.x:636" />
</bean>
<bean id="userAuthenticationService" class="com.company.authentication.ActiveDirectoryAuthService">
<property name="contextSource" ref="ADContextSource" />
</bean>
最后,userAuthenticationService
bean 被注入到客户端类中,比如登录控制器。
package com.company.web;
import com.company.authentication;
@Controller
public class LoginController {
@Autowired
private IAuthenticate userAuthenticationService;
public String authenticateUser(String login, String password) {
if (this.userAuthenticationService.authenticate(login, password)) {
return "welcome";
}
else {
return "login";
}
}
}