【问题标题】:ldap.rememberMe.usernameMapper.userDnBase (multiple instances of?) (searchSubtree search capability)ldap.rememberMe.usernameMapper.userDnBase(多个实例?)(searchSubtree 搜索能力)
【发布时间】:2023-03-18 00:49:01
【问题描述】:

我有一个成功使用最新的 spring-security-core:2.0-RC4spring-security-ldap 的 Grails 应用程序: 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=教育。如上所述 - 登录工作正常,因为我已将一个名为 searchSubtree 的属性设置为 true。不幸的是,searchSubtree 设置并不成立,并且在代码的“记住我”部分中始终如一地执行 (.ldap.rememberMe)*。代码的 remember-me 部分使用基本 DN 的映射,grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase 所以我在 config.groovy 文件中放入了一个字符串(与身份验证部分相同)以映射到 ou= 的基本 DN 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 记住我功能适用于所有员工,但不适用于所有其他员工人 - 学生、教师等。

在本期中,对我而言,以下主要设置是: grails.plugin.springsecurity.ldap.rememberMe.usernameMapper.userDnBase

因为这只是一个映射,并且不允许多个 userDNBasessearchSubtree 搜索。 . “记住我”代码应该如何找到不属于此基本 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'

【问题讨论】:

    标签: grails spring-security grails-plugin remember-me spring-security-ldap


    【解决方案1】:

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

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

    我使用了regular spring security remember me cookie option,但没有在 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多