1

我有一个成功地采用了最新的弹簧安全核心Grails应用程序:2.0 RC4弹簧security-ldap:2.0-RC2。用户可以使用 完美登录grails.plugin.springsecurity.ldap.search.base设置LDAP登录验证。ldap.rememberMe.usernameMapper.userDnBase(?的多个实例)(searchSubtree搜索功能)

没有为了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 ....它被映射到LDAP用于LDAP用户在返回时查找持久性cookie登录的应用程序。

这里是我的问题出现的地方,大多数用户在我们的LDAP系统中被隔离到不同的DIT中。例如,一些用途是在OU =的工作人员,OU =人,DC = sitcudy,DC = EDU,而其他用户在OU =学生,OU =人,DC = sitcudy,DC = EDU因此,由于记住了我的映射,在返回到应用程序后,一旦验证了cookie,代码就会尝试以这种格式绑定用户,其中包含用户绑定的用户,其中包括用户名,密码,不存在。什么确实存在是UID = reuben_marcus,OU =员工,OU =人,DC = sitcudy,DC = EDU因此cookie将被破坏,登录(IS_AUTHENTICATED_REMEMBERED)永远不会发生。

如果我更改grails.plugin.springsecurity.ldap.rememberMe.usernameMapper。userDnBaseOU =的工作人员,OU =人,DC = sitcudy,DC = EDU的记得我的功能可以完美运行所有工作人员,但它并不适用于所有其他人的工作 - 学生,教师等。

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

由于这只是一个映射,有ISN” t多个配额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' 

回答

0

此问题。这里所说的:Grails - Spring security plugin ldap: remember me not working

我找到解决类似的问题在resources.groovy定制TokenBasedRememberMeServices豆登记。 我没有使用grails-spring-security-ldap插件中提供的持久性登录功能,因为我发现它与我的Active Directory树布局不兼容。最有可能的是,这可以通过扩展LdapUserDetailsManager来定制,但在我的情况下,我发现它不需要在数据库中存储令牌。

我使用regular spring security remember me cookie option但没有在cookie中存储用户密码。我延长了以下几种方式来TokenBasedRememberMeServices

  • makeTokenSignature - 使令牌签名无密码字段
  • processAutoLoginCookie - 如果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) 
}