spnego身份验证后的glassfish ldap授权

spnego身份验证后的glassfish ldap授权,glassfish,ldap,java-ee-6,spnego,jaspic,Glassfish,Ldap,Java Ee 6,Spnego,Jaspic,我们使用apachemod_proxy_http和SPNEGO成功地实现了SSO。在我的JavaEE6Web应用程序中,我使用request.getRemoteUser()获取经过身份验证的用户 那么,授权的最佳方式是什么呢。我们的目标是在我们的Microsoft AD over LDAP中检查用户的特定角色成员身份。使用glassfish 3.1.2实现这一目标的最佳方法是什么?这取决于您的用例。 如果您只想从广告中了解角色,可以在LDAP上进行手动搜索 例如: import javax.na

我们使用apachemod_proxy_http和SPNEGO成功地实现了SSO。在我的JavaEE6Web应用程序中,我使用request.getRemoteUser()获取经过身份验证的用户


那么,授权的最佳方式是什么呢。我们的目标是在我们的Microsoft AD over LDAP中检查用户的特定角色成员身份。使用glassfish 3.1.2实现这一目标的最佳方法是什么?

这取决于您的用例。 如果您只想从广告中了解角色,可以在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


如果您想在应用程序中使用这些组来分配角色,那么事情就有点棘手了。要实现这一点,您可能需要一个自定义(示例),或者必须修改SPNEGO部分,以便根据AD/LDAP中的数据分配角色

这取决于您的用例。 如果您只想从广告中了解角色,可以在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


如果您想在应用程序中使用这些组来分配角色,那么事情就有点棘手了。要实现这一点,您可能需要一个自定义(示例),或者必须修改SPNEGO部分,以便根据AD/LDAP中的数据分配角色

你能做到吗?如果是的话,你介意在这里加上答案吗?你能做到吗?如果是,请在此处添加答案?