Как изменить подключаемый модуль Grails spring-security-ldap:2.0.1 для использования настроенного AuthoritiesPopulator?

Я использую Grails 2.4.4, использую плагины spring-security-core:2.0.0 и spring-security-ldap:2.0.1. Служба LDAP от OpenLdap.

Вышеупомянутое работает, я могу вывести пользователя ROLE_ из группы, членом которой является пользователь.

Но у нас есть изменение требований, и теперь нам нужно определить РОЛИ пользователя из вложенного дерева групп LDAP.

Я проверил, и spring-security-ldap:2.0.1 основан на springsecurity 3.2.9, который еще не включал NestedLdapAuthoritiesPopulator, поэтому я пошел на github и взял этот и несколько других классов зависимостей, вставил их и изменил мои ресурсы .groovy, чтобы использовать это как таковое:

beans = {
ldapAuthProvider(org.springframework.security.ldap.authentication.LdapAuthenticationProvider,
            ref("ldapAuthenticator"), // Use default
            ref("myLdapAuthoritiesPopulator") // Use custom
    ) {}

    myLdapAuthoritiesPopulator(com.ldap.NestedLdapAuthoritiesPopulator, ref("contextSource2"), application.config.grails.plugin.springsecurity.ldap.authorities.groupSearchBase ) {}

    // Set up the manager to read LDAP
    contextSource2(DefaultSpringSecurityContextSource, application.config.grails.plugin.springsecurity.ldap.context.server) {       
        userDn = application.config.grails.plugin.springsecurity.ldap.context.managerDn ?:null 
        password = application.config.grails.plugin.springsecurity.ldap.context.managerPassword ?:null
    }

Но как только я попробовал, я столкнулся с ошибкой как таковой:

Message: [LDAP: error code 49 - Invalid Credentials]; nested exception is javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials]
    Line | Method
->>  257 | searchForMultipleAttributeValues in com.ldap.SpringSecurityLdapTemplate$$EQx0bs0G
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    200 | performNestedSearch              in com.ldap.NestedLdapAuthoritiesPopulator
|    160 | getGroupMembershipRoles . . . .  in     ''
|    213 | getGrantedAuthorities            in com.ldap.DefaultLdapAuthoritiesPopulator$$EQx0Xl3o
|     59 | attemptAuthentication . . . . .  in grails.plugin.springsecurity.web.authentication.GrailsUsernamePasswordAuthenticationFilter
|     62 | doFilter                         in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|     59 | doFilter . . . . . . . . . . . . in grails.plugin.springsecurity.web.SecurityRequestHolderFilter
|   1145 | runWorker                        in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . . . . . . . . . . . .  in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run                              in java.lang.Thread
Caused by AuthenticationException: [LDAP: error code 49 - Invalid Credentials]

Я что-то упустил? Или есть лучший способ добиться того, что я пытаюсь сделать?

[Править 20180711]

Я решил вышеуказанную проблему, добавив в contextSource2 в resources.goovy:

    contextSource2(DefaultSpringSecurityContextSource, application.config.grails.plugin.springsecurity.ldap.context.server) {
        userDn = application.config.grails.plugin.springsecurity.ldap.context.managerDn ?:null
        password = application.config.grails.plugin.springsecurity.ldap.context.managerPassword ?:null
        authenticationSource = ref('ldapAuthenticationSource')
        authenticationStrategy = ref('authenticationStrategy')
        anonymousReadOnly = true 
}

ldapAuthenticationSource(SimpleAuthenticationSource) {
    principal = "uid=admin,dc=myCompany,dc=com"
    credentials = "Admin123"
}
authenticationStrategy(GrailsSimpleDirContextAuthenticationStrategy) {
    userDn = "uid=admin,dc=myCompany,dc=com"
}

Теперь я могу войти в систему и сделать вывод о вложенных группах как о роли, но есть еще одна проблема: пользователь во вложенной группе не может быть найден при поиске в органах власти.

Например, если у меня есть дерево иерархии групп, подобное этому:

Groups -> group02 -> user01
       -> group01 (having member group02)
       -> group03 -> group04 -> user02

Если войти в систему как user01, роль выводится как ROLE_GROUP01 и ROLE_GROUP02. Но если войти в систему как user02, роль вообще не возвращается.

Я играл с конфигурацией, как показано ниже, но тоже не работает:

grails.plugin.springsecurity.ldap.authorities.groupSearchBase = 'ou=Groups,dc=myCompany,dc=com'
grails.plugin.springsecurity.ldap.authorities.searchSubtree = true

Любая помощь, пожалуйста?

Если это делает другое, dn группы01

cn=group01,ou=Groups,dc=myCompany,dc=com

и DN group04:

cn=group04,cn=group03,ou=Groups,dc=myCompany,dc=com

person alchn    schedule 06.07.2018    source источник


Ответы (1)


Ах, nvm, я также понял свой последний вопрос - поскольку сейчас я запускаю свой собственный класс SpringSecurityLdapTemplate (где фактически происходит поиск), конфигурация "grails.plugin.springsecurity.ldap.authorities.searchSubtree" не была передана это... Так что я просто добавляю этот конфиг прямо в него где-то перед вызовом search(), вот так:

SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);,
...
search(base, formattedFilter, ctls, roleMapper);

И теперь он работает так, как ожидалось.

person alchn    schedule 12.07.2018