我们使用 Apache mod_proxy_http 和 SPNEGO 成功实现了 SSO。在我的 Java EE 6 Web 应用程序中,我使用 request.getRemoteUser() 获得了经过身份验证的用户。
现在什么是授权的最佳方式。我们的目标是通过 LDAP 在我们的 Microsoft AD 中检查用户的特定角色成员身份。使用 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(此处为示例),或者您必须修改 SPNEGO 部分以根据来自 AD/LDAP 的数据分配角色。