1

我们使用 Apache mod_proxy_http 和 SPNEGO 成功实现了 SSO。在我的 Java EE 6 Web 应用程序中,我使用 request.getRemoteUser() 获得了经过身份验证的用户。

现在什么是授权的最佳方式。我们的目标是通过 LDAP 在我们的 Microsoft AD 中检查用户的特定角色成员身份。使用 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此处为示例),或者您必须修改 SPNEGO 部分以根据来自 AD/LDAP 的数据分配角色。

于 2012-12-17T13:26:03.193 回答