0

我正在使用 spring security 3.1.3 通过 LDAP 进行身份验证,代码工作正常。现在,我想获得一组经过身份验证的用户。我在我的应用程序中开发了我的自定义 LdapAuthoritiesPopulator。下面是我的代码。

public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) {
        List<GrantedAuthority> grantedAuthorities = null;
        Object[] objects = userData.getObjectAttributes("memberOf");
        for(Object object: objects){
            System.out.println((String)object + "---------"+object.getClass());
        }
}


console output : CN=Administrators,CN=Builtin,DC=example,DC=in

我不想执行字符串解析,是否有任何内置函数以便我可以在上述实现中获取经过身份验证的用户组?

4

2 回答 2

1

您是否考虑过使用ActiveDirectoryLdapAuthenticationProvider而不是定制的LdapAuthenticationProvider?它是为处理 AD 量身定做的,例如从组成员到权限的映射已经在其loadUserAuthorities()方法中实现。

参见19.5。有关更多详细信息,请参阅参考文档中的Active Directory 身份验证

于 2013-05-24T09:59:58.440 回答
0

你的问题真的不清楚你真正想要做什么。我假设基于到目前为止所讨论的任何内容,您想从您获得的 DN 中提取(即解析出)组的名称。在您的示例中,您想从“CN=Administrators,CN=Builtin,DC=example,DC=in”中提取“CN=Administrators”RDN ??!同样,这是我基于我阅读和理解的假设(有点)。

如果您不想进行解析,您也许可以使用 JNDI 的 CompoundnName 类和您自己的语法定义,但我不确定使用这个类是否会给您带来比您自己的字符串解析更显着的优势,实际上不应该变得复杂。但是,这是使用 CompoundName 的方法:

import java.util.Properties;

import javax.naming.CompoundName;

public class NameTestSimple {
    public static void main(String[] args) throws Exception{

        Properties syntax = new Properties();
        syntax.setProperty("jndi.syntax.direction", "left_to_right");
        syntax.setProperty("jndi.syntax.separator", ",");
        syntax.setProperty("jndi.syntax.ignorecase", "true");
        syntax.setProperty("jndi.syntax.escape", "\\");
        syntax.setProperty("jndi.syntax.trimblanks", "true");
        // syntax.setProperty("jndi.syntax.separator.ava", ",");
        syntax.setProperty("jndi.syntax.separator.typeval", "=");
        syntax.setProperty("jndi.syntax.beginquote", "\"");

        String name = "CN=Administrators,CN=Builtin,DC=example,DC=in";

        CompoundName cn = new CompoundName(name, syntax);

        System.out.println("DN: " + cn);

        System.out.println("\nCompoundName details:\n");

        for (int i = 0; i < cn.size(); i++) {
            System.out.println("  " + i + " --> " + cn.get(i));
        }
    }
}

即使这样,您仍然需要解析各个 RDN 以获取属性值(例如,解析“CN=Administrators”以提取“Administrators”的值)。

于 2013-05-28T15:34:35.207 回答