ldap.rememberMe.usernameMapper.userDnBase (несколько экземпляров?) (возможность поиска в поддереве поиска)

У меня есть приложение Grails, которое успешно использует последние версии spring-security-core:2.0-RC4 и spring-security-ldap:2.0-RC2. . Пользователи могут без проблем входить в систему, используя настройку grails.plugin.springsecurity.ldap.search.base для аутентификации входа LDAP.

Существует другой параметр для элемента RememberMe userDnBase (сопоставитель), и этот параметр выглядит следующим образом: grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase

Для аутентификации LDAP grails.plugin.springsecurity.ldap.search.base установлено значение ou=people,dc=sitcudy,dc=edu. Как упоминалось выше, вход в систему работает нормально, потому что есть свойство с именем searchSubtree, для которого я установил значение true. К сожалению, параметр searchSubtree не является истинным и последовательно применяется в части кода «запомнить меня» (.ldap.rememberMe< /эм>)*. Часть кода для запоминания использует карту для базового DN, grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase, поэтому я вставил строку в файл config.groovy (тот же, что и для части аутентификации) для сопоставления с базовым DN ou=people,dc=sitcudy,dc =edu.... который сопоставляется с DN для пользователя LDAP, который ищет его при возвращении в приложение для входа в систему с постоянными файлами cookie.

Вот где возникает моя проблема: большинство пользователей разделены на разные DIT в нашей системе LDAP. Например, некоторые пользователи относятся к ou=staff,ou=people,dc=sitcudy,dc=edu, а другие — к ou=students. ,ou=people,dc=sitcudy,dc=edu поэтому из-за сопоставления «запомнить меня» при возврате в приложение после проверки файла cookie код пытается привязать пользователей в этом формате, uid=reuben_marcus,ou=people,dc=sitcudy,dc=edu, которого не существует. Что действительно существует, так это uid=reuben_marcus,ou=staff,ou=people,dc=sitcudy,dc=edu, поэтому файл cookie уничтожается, а логин (< em>IS_AUTHENTICATED_REMEMBERED) никогда не встречается.

Если я изменю grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase на ou=staff,ou=people,dc=sitcudy,dc =edu функция «запомнить меня» отлично работает для всех сотрудников, но не для всех остальных людей — студентов, преподавателей и т. д.

Основной параметр, о котором идет речь ниже для меня в этой проблеме: grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase

Поскольку это всего лишь сопоставление, и не допускается поиск по нескольким userDNBase или searchSubtree. Как код "запомнить меня" должен находить пользователей, которые не попадают в эту базовую настройку DN...??

Интересно, я делаю что-то не так, или это запрос функции, чтобы код «запомнить меня» имел параметры для нескольких сопоставлений userDNBases или разрешил ему иметь searchSubtree возможность поиска.

Соответствующие настройки из моего config.groovy:

grails.plugin.springsecurity.ldap.mapper.roleAttributes = 'sitPriRole,uid'
grails.plugin.springsecurity.ldap.context.managerDn = 'uid=SPS_bind,ou=People,dc=sitcudy,dc=edu'
grails.plugin.springsecurity.ldap.context.managerPassword = 'xxx' 
grails.plugin.springsecurity.ldap.context.server = 'ldap://ds01.sitcudy.edu:389'
grails.plugin.springsecurity.ldap.authorities.groupSearchBase ='ou=Groups,dc=sitcudy,dc=edu' 


grails.plugin.springsecurity.ldap.search.base = 'ou=People,dc=sitcudy,dc=edu'
grails.plugin.springsecurity.ldap.search.searchSubtree = true
grails.plugin.springsecurity.ldap.auth.hideUserNotFoundExceptions = false
grails.plugin.springsecurity.ldap.search.attributesToReturn = ['uid', 'sitPriRole', 'mail', 'displayName']
grails.plugin.springsecurity.providerNames = ['ldapAuthProvider', 'anonymousAuthenticationProvider', 'rememberMeAuthenticationProvider']
grails.plugin.springsecurity.ldap.authorities.retrieveGroupRoles = false
grails.plugin.springsecurity.ldap.authorities.retrieveDatabaseRoles = false
grails.plugin.springsecurity.password.algorithm = 'SHA-256'


grails.plugin.springsecurity.rememberMe.persistent = true 
grails.plugin.springsecurity.rememberMe.persistentToken.domainClassName = 'od.PersistentLogin' 


// role-specific LDAP config 
// grails.plugin.springsecurity.ldap.useRememberMe = true
grails.plugin.springsecurity.ldap.rememberMe.detailsManager.attributesToRetrieve = null 
grails.plugin.springsecurity.ldap.rememberMe.detailsManager.groupMemberAttributeName = 'uniquemember'
grails.plugin.springsecurity.ldap.rememberMe.detailsManager.groupRoleAttributeName = 'cn' 
grails.plugin.springsecurity.ldap.rememberMe.detailsManager.groupSearchBase = 'ou=Groups,dc=sitcudy,dc=edu'
grails.plugin.springsecurity.ldap.rememberMe.detailsManager.passwordAttributeName = 'userPassword'
grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase = 'ou=People,dc=sitcudy,dc=edu'
grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.usernameAttribute = 'uid'

person Reuben M Marcus    schedule 06.11.2014    source источник


Ответы (1)


Эта проблема упоминалась здесь: Grails — подключаемый модуль безопасности Spring ldap: помните я не работаю

Я нашел обходной путь для этого, зарегистрировав пользовательский TokenBasedRememberMeServices в resources.groovy. Я не использовал функцию постоянного входа в систему, доступную в плагине grails-spring-security-ldap, потому что я обнаружил, что она несовместима с моей древовидной структурой Active Directory. Скорее всего, это можно настроить, расширив LdapUserDetailsManager, но в моей ситуации я счел ненужным хранить токен в базе данных.

Я использовал обычная пружинная безопасность запомнит меня в файле cookie, но без сохранения пароля пользователя в файле cookie. Я расширил следующие методы из TokenBasedRememberMeServices

  • makeTokenSignature - сделать токен-подпись без поля пароля
  • processAutoLoginCookie- если файл cookie существует, то получить имя пользователя из маркера файла cookie и получить данные пользователя ldap (мне пришлось написать свой собственный метод retrieveUserFromLdap(), который будет объяснен позже)
  • onLoginSuccess — срабатывает, когда пользователь входит в систему с включенной опцией «запомнить меня». Здесь я удаляю пароль и сохраняю подпись токена в файле cookie.

Чтобы получить информацию о пользователе и роли из LDAP, это может зависеть от конкретной реализации, но мой метод выглядит следующим образом:

    static protected UserDetails retrieveUserFromLdap(String username) {
    def ldapUserSearch = Holders.applicationContext.getBean('ldapUserSearch')
    def userContextMapper = Holders.applicationContext.getBean('ldapUserDetailsMapper')
    def authoritiesPopulator = Holders.applicationContext.getBean('ldapAuthoritiesPopulator')

    def userContext = ldapUserSearch.searchForUser(username)
    def userAuthorities = authoritiesPopulator.getGrantedAuthorities(userContext,username)
    userContextMapper.mapUserFromContext(userContext,username,userAuthorities)
}
person mordka    schedule 11.02.2015