Spring MVCアプリケーション(3.0.5バージョンを使用)があり、ユーザーの資格情報のみを認証するために、SpringLDAPを使用してActiveDirectoryにバインドする必要があります。アプリケーションはLinuxサーバーでホストされているため、クロスプラットフォームソリューションが必要です。また、アプリケーションはSpringSecurityを使用しません。
この設定でユーザー認証を実装する効果的な方法は何ですか?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;
}
}
次に、 connection-controlクラス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";
}
}
}