Я на Grails 2.4.4, использую плагины spring-security-core: 2.0.0 и spring-security-ldap: 2.0.1. Служба LDAP от OpenLdap.
Выше работает, я могу вывести пользователя ROLE_ из группы, членом которой является пользователь.
Но у нас есть изменение требования, и теперь нам нужно вывести пользовательские роли (ROLE) из вложенного дерева групп LDAP.
Я проверил, и spring-security-ldap: 2.0.1 основан на springsecurity 3.2.9, который еще не включал в себя NestedLdapAuthoritiesPopulator, поэтому я пошел в github и взял этот и несколько других классов зависимостей, добавил их и изменил мои resources.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 группы 04:
cn=group04,cn=group03,ou=Groups,dc=myCompany,dc=com