1

Apachemod_proxy_httpとSPNEGOを使用してSSOを正常に実装しました。私のJavaEE6 Webアプリケーションでは、request.getRemoteUser()を使用して認証されたユーザーを取得します。

さて、承認のための最良の方法は何でしょうか。私たちの目標は、LDAPを介したMicrosoftADのユーザーの特定の役割のメンバーシップを確認することです。Glassfish 3.1.2でそれを達成するための最良の方法は何でしょうか?

4

1 に答える 1

1

ユースケースによって異なります。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 部分を変更する必要があります。

于 2012-12-17T13:26:03.193 に答える