解析memberOf属性以获取spring security3中的组

时间:2013-05-24 09:46:24

标签: string spring-mvc spring-security ldap

我使用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

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

2 个答案:

答案 0 :(得分:1)

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

有关详细信息,请参阅参考文档中的19.5. Active Directory Authentication

答案 1 :(得分: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”以提取“管理员”的值)。