当前位置: 首页 > 知识库问答 >
问题:

ldap.rememberme.usernameMapper.userDNBase(多个实例?)(searchSubtree搜索功能)

洪飞驰
2023-03-14

我有一个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设置并不成立,并且在代码的'remember-me'部分(.ldap.rememberme)*中保持一致。代码的remember-me部分使用了基本DN的映射grails.plugin.springsecurity.ldap.rememberme.usernamemapper.userDNBase,所以我在config.groovy文件中添加了一个字符串(与身份验证部分相同),以映射到OU=People,DC=sitcudy,DC=edu....它映射到LDAP用户在返回应用程序时查找的DN以进行持久化cookie登录。

这就是我的问题所在,在我们的LDAP系统中,大多数用户被隔离到不同的DIT中。例如,有些用法是在ou=staff,ou=people,dc=sitcudy,dc=edu中,而其他用户是在ou=students,ou=people,dc=sitcudy,dc=edu中。因此,由于remember me映射,在返回应用程序时,一旦验证cookie,代码将尝试以这种格式绑定用户,uid=reuben_marcus,ou=people,dc=sitcudy,dc=edu。所存在的是uid=reuben_marcus,ou=staff,ou=people,dc=sitcudy,dc=edu,因此cookie被销毁,登录(is_authenticated_remement)从不发生。

如果我将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设置的用户...??

我想知道我是否做错了什么,或者这是一个功能请求,让“记住我”代码有多个映射userDNbase的选项,或者允许它有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'

共有1个答案

郑星雨
2023-03-14

这里提到了这个问题:Grails-Spring Security插件LDAP:记住我不工作

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

我使用了常规的spring security remember me cookie选项,但没有在cookie中存储用户密码。我从tokenbasedremembermeservices扩展了以下方法

  • Maketokensignature-使标记签名不带密码字段
  • processautologincookie-如果cookie存在,那么从cookie令牌中检索用户名并获取ldap用户详细信息(我必须编写自己的方法retrieveUserfromldap()
  • 稍后解释)
  • onloginsuccess-当用户在选中remember-me选项的情况下登录时,会触发此操作。在这里,我删除密码并将令牌签名保存到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)
}
 类似资料:
  • 本文向大家介绍ThinkPHP实现ajax仿官网搜索功能实例,包括了ThinkPHP实现ajax仿官网搜索功能实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ThinkPHP实现ajax仿官网搜索功能的方法。分享给大家供大家参考。 具体实现方法如下: 后台代码: 前端代码: 希望本文所述对大家的ThinkPHP框架程序设计有所帮助。

  • 我正在尝试实现一个二叉查找树,但是“搜索”函数对于除了根之外的每个条目都返回了错误的值。 该函数应返回其值与键参数匹配的节点的地址,如果节点不存在,则返回 NULL。 当我运行代码时,我得到以下内容: 我知道每个节点的“左”和“右”指针链接正确,因为“delAll”函数成功删除了所有节点。 将“cout”语句添加到“search”函数表明该函数似乎返回了正确的地址。为什么从主主调用时会打印错误的地

  • 本文向大家介绍java IO实现电脑搜索、删除功能的实例,包括了java IO实现电脑搜索、删除功能的实例的使用技巧和注意事项,需要的朋友参考一下 一.递归方法 1.递归就是自己调用本身的方法,前提是有方法。 2.递归使用 找出递归的规律 递归要有出口条件,也就是结束条件 3.注意事项 递归次数不能太多,否则会出现堆栈溢出现象 递归不能嵌套使用,否则出现死递归 二.IO介绍 1. i为Input输

  • 问题内容: 我需要能够使用一个简单的搜索来搜索数据库的SQL查询。这是我的表格现在的样子: 我将如何去做呢?这是我尝试过的一些SQL查询,但是我的问题是它返回了大量数据。例如,如果我搜索像Snoop Dogg这样的艺术家,即使没有专辑名称,它也会为他所拥有的每张专辑和每首歌曲返回一行。 编辑: 这是一个示例数据库; 因此,我想搜索“ snoop”以仅返回艺术家“ Snoop Dogg”。但随后进行

  • 本文向大家介绍javascript实现简单搜索功能,包括了javascript实现简单搜索功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javascript实现简单搜索功能的具体代码,供大家参考,具体内容如下 注意事项: A.search(B)可以在A中搜索B的位置,返回B出现的位置 A.split(B)将A以B划分为几部分,并返回数组,相当于分词操作 运行结果如下: 更多搜索

  • 本文向大家介绍Android实现搜索历史功能,包括了Android实现搜索历史功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现搜索历史的具体代码,供大家参考,具体内容如下 SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空  1. 判断搜索内容是否含表情,不需要可以不判断 2.软键盘工具类弹出、关闭,不需要可以不判断 3.存储工具