【问题标题】:parse memberOf attribute to get group in spring security3在spring security3中解析memberOf属性以获取组
【发布时间】:2013-05-19 21:12:45
【问题描述】:

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

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

【问题讨论】:

    标签: string spring-mvc spring-security ldap


    【解决方案1】:

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

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

    【讨论】:

    • 不,我做错了吗?还有一件事,我想从数据库而不是 LDAP 填充权限。整个场景是从 LDAP 验证用户并获取相应的用户组,然后从数据库中填充权限。
    • 如果您想针对 AD 进行身份验证,配置 ActiveDirectoryLdapAuthenticationProvider 可能会更容易,但您当然也可以使用普通的 LdapAuthenticationProvider。如您所见,loadUserAuthorities() 的上述链接实现仅采用组 DN (Administrators) 的最后一段的值。您可以在您的自定义 LdapAuthoritiesPopulator 中执行相同的操作,并据此从数据库中获取您需要的任何信息。
    • 怎么做?你能用自定义的 LdapAuthoritiesPopulator 解释一下吗?
    • 您能否更具体地解释一下什么?您可以使用一些类似于loadUserAuthorities() 实现的代码来获取组成员资格。然后以您通常与数据库交谈的任何方式根据组获取数据。如果您需要有关如何在 xml 配置中连接的帮助,请尝试检查 this answer 我给了一个类似的问题。
    • 我正在寻找内置函数来解析从下面的代码返回的字符串对象。 Object[] objects = userData.getObjectAttributes("memberOf");有内置功能吗?我正在尝试在字符串输出下方进行解析,以便获得经过身份验证的用户组 CN=Administrators,CN=Builtin,DC=example,DC=in.
    【解决方案2】:

    您的问题确实不清楚您真正想要做什么。我假设基于到目前为止所讨论的任何内容,您想要从您获得的 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”的值)。

    【讨论】:

    • 你的假设是我想要的。但是,zagyi 的最后一条评论解决了我的问题。即 new DistinguishedName(group).removeLast().getValue();据我所知,这表现得非常好。无论如何都可以打破吗?
    猜你喜欢
    • 2017-09-05
    • 2013-03-04
    • 2021-12-13
    • 2018-12-18
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多