1

我有一个成功使用最新spring-security-core:2.0-RC4spring-security-ldap:2.0-RC2的 Grails 应用程序。用户可以使用 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 )*中始终如一地执行。代码的 remember-me 部分使用基本 DN 的映射 grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase所以我在config.groovy文件 中放入一个字符串(与身份验证部分相同)映射到的基本 DNou=people,dc=sitcudy,dc=edu .... 映射到 DN 以便 LDAP 用户在返回应用程序以进行持久性 cookie 登录时查找。

这就是我的问题所在,大多数用户在我们的 LDAP 系统中被隔离到不同的 DIT 中。例如,某些用途在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 被销毁并且登录(IS_AUTHENTICATED_REMEMBERED)永远不会发生。

如果我将grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase更改 为ou=staff,ou=people,dc=sitcudy,dc=edu,remember me 功能对所有员工都很有效,但不适用于所有其他人——学生、教师等。

在这个问题上,我下面的主要设置是: grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase

由于这只是一个映射,并且不允许多个userDNBasessearchSubtree搜索.. 'remember-me' 代码应该如何找到不属于此基本 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'
4

1 回答 1

0

这里提到了这个问题:Grails - Spring security plugin ldap: remember me not working

我通过TokenBasedRememberMeServicesresources.groovy. 我没有使用grails-spring-security-ldap插件中提供的持久登录功能,因为我发现它与我的 Active Directory 树布局不兼容。很可能,这可以通过扩展来定制,LdapUserDetailsManager但在我的情况下,我发现没有必要将令牌存储在数据库中。

我使用了常规的 spring security 记住我的 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)
}
于 2015-02-11T16:23:01.257 回答