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) 
}