Извлечение атрибута LDAP-члена из приложения Grails Spring

Возможно, я застрял в очень глупом вопросе, пытаясь реализовать аутентификацию / авторизацию на основе ролей LDAP в приложении Grails (книжный магазин), используя плагины spring-security-core и spring-security-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;
}

Интересно, что когда я запускаю запрос по LDAP с использованием ldapsearch, я получаю возвращенный атрибут.

Я застрял в том, как настроить эквивалент "запроса:" (как показано ниже с ldapsearch) в конфигурации Grails LDAP, чтобы плагин мог извлечь атрибут "memberof" (я пытался добавить его в плагин Grails LDAP Конфигурация с ldap.search.attributesToReturn, но безрезультатно).

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()
Другие вопросы по тегам