Apachemod_proxy_httpとSPNEGOを使用してSSOを正常に実装しました。私のJavaEE6 Webアプリケーションでは、request.getRemoteUser()を使用して認証されたユーザーを取得します。
さて、承認のための最良の方法は何でしょうか。私たちの目標は、LDAPを介したMicrosoftADのユーザーの特定の役割のメンバーシップを確認することです。Glassfish 3.1.2でそれを達成するための最良の方法は何でしょうか?
ユースケースによって異なります。AD からのロールのみを知りたい場合は、LDAP で手動検索を実行できます。
例:
import javax.naming.*;
import javax.naming.directory.*;
public class test {
public String ldapUri = "ldap://localhost";
public String usersContainer = "cn=users,dc=example,dc=com"; // base DN for search
public String username = "user";
public String password = "pass";
public static void main(String args[]){
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapUri);
env.put( Context.SECURITY_PRINCIPAL, username );
env.put( Context.SECURITY_CREDENTIALS, password );
env.put(Context.REFERRAL, "follow");
try {
DirContext ctx = new InitialDirContext(env);
SearchControls ctls = new SearchControls();
String name = "your_username"; // full DN name
NamingEnumeration answer = ctx.search(usersContainer, "(member=" + name + ")",ctls );
while(answer.hasMore()) {
SearchResult rslt = (SearchResult)answer.next();
Attributes attrs = rslt.getAttributes();
System.out.println(attrs.get("cn"));
}
ctx.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
ユーザー名はユーザーの完全な DN でなければならないことに注意してください。 CN=user1,CN=users,DC=company,DC=com
これらのグループをアプリケーションでの役割の割り当てに使用したい場合は、少し注意が必要です。これを実現するには、おそらくカスタムServerAuthModule (例はこちら) が必要になるか、AD/LDAP からのデータに基づいてロールを割り当てるように SPNEGO 部分を変更する必要があります。