在 Grails Spring 应用程序中获取 LDAP 属性 memberof

Posted

技术标签:

【中文标题】在 Grails Spring 应用程序中获取 LDAP 属性 memberof【英文标题】:Fetching LDAP attribute memberof inside Grails Spring application 【发布时间】:2017-09-05 01:49:16 【问题描述】:

我可能会遇到一个非常愚蠢的问题,尝试使用 spring-security-core 和 spring-security-ldap 插件在 Grails 应用程序(书店)中实现基于 LDAP 角色的身份验证/授权。我创建了一个自定义 UserDetailsContextMapper 并尝试将我的 LDAP 角色与应用程序角色映射。但是,memberof 属性永远不会在属性中返回。

UserDetails mapUserFromContext(DirContextOperations ctx, String username,
                                  Collection authorities)  
        Attributes attributes = ctx.getAttributes();
        Object[] groups = new Object[10];
        groups = ctx.getObjectAttributes("memberof"); //returns empty array 

        Set<GrantedAuthority> authority = new HashSet<GrantedAuthority>();

        for(Object group: groups)
            if (group.toString().toLowerCase().contains("ROLE_FROM_LDAP".toLowerCase()) == true)
                authority.add(new SimpleGrantedAuthority("ROLE_APP"));
                break;          
                       
        

        User userDetails = new User(username, "", false, false, false, false, authority); 
        return userDetails;

有趣的是,当我使用 ldapsearch 在 LDAP 上运行查询时,我确实得到了返回的属性。

我遇到的问题是如何在 Grails LDAP 配置中配置等效的“requesting:”(如下所示,使用 ldapsearch),以便该插件能够获取“memberof”属性(我尝试使用 ldap.search.attributesToReturn 将其添加到 Grails LDAP 插件配置,但无济于事)。

ldapsearch -t -x -b "ou=people,dc=domain,dc=com" "cn=myusername" memberof
.....
# LDAPv3
# base <ou=people,dc=domain,dc=com> with scope subtree
# filter: cn=myusername
# requesting: memberof
#
.....
dn: cn=myusername,ou=people,dc=domain,dc=com
memberOf: cn=ROLE_FROM_LDAP,ou=groups,dc=domain,dc=com

以下是 Grails LDAP 配置:

grails 
    plugin 
        springsecurity 
            providerNames: ['ldapAuthProvider', 'anonymousAuthenticationProvider']          
            ldap 
                useRememberMe = false               
                context 
                    managerDn = 'cn=manager,dc=domain,dc=com'                   
                    managerPassword = 'secret'
                    server = 'ldap://localhost:389/'
                      
                search 
                    base = 'ou=people,dc=domain,dc=com'
                    filter = 'cn=0'
                    searchSubtree = true
                    attributesToReturn: ['memberOf'] //extra attributes you want returned
                               
                auth 
                    hideUserNotFoundExceptions = false
                
                authorities 
                    retrieveDatabaseRoles = false
                    retrieveGroupRoles = true
                    groupSearchBase = 'ou=groups,dc=domain,dc=com'                  
                    groupSearchFilter = 'member=0'           
                               
            
        
    

【问题讨论】:

【参考方案1】:

你可以注入 springSecurityService 并获取如下:

springSecurityService.getPrincipal().getAuthorities()

【讨论】:

感谢 Mike 的帮助,事实上,在 mapUserFromContext 回调中可用的收集权限包含权限对象。但是,我最初的问题仍然是如何通过 Grails 插件配置查询“memberof”属性,因为查询是通过 ldapsearch 工作的。

以上是关于在 Grails Spring 应用程序中获取 LDAP 属性 memberof的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JOSSO 和 Spring Security 从 Grails 应用程序中的 LDAP 获取自定义属性?

如何使用 spring-security-rest:1.4.0.RC5 在 grails 中获取 facebook 用户的联系人列表

如何在Grails 2单元测试中获取spring security提供的currentUser

如何使用spring security在grails中获取所有当前登录用户的列表(包括rememberme cookie)

Grails spring security LDAP 从 LDAP 基础获取 ROLE

如何在 GSP 中使用 Spring Security Grails 插件获取 current_user