4

我有Grails Spring Security插件連接到一個Active Directory服務器,沒有任何問題。但是,我需要連接到多個服務器。我們在一臺AD服務器上有一些用戶,另一臺服務器上有其他用戶,所以我們需要嘗試在兩個位置上查找用戶。帶有多個活動目錄服務器的Grails Spring Security LDAP插件

例如,在Java中我有這個如下工作:

<authentication-manager> 
    <authentication-provider ref="provider1"/> 
    <authentication-provider ref="provider2"/> 
... 
</authentication-manager> 

<ldap-server id="provider1" 
      url="ldap://LDAPSERVER1.mycompany.intranet" 
      manager-dn="OU=std_users,OU=users,DC=mycompany,DC=intranet" 
      manager-password="blah"/> 

<ldap-server id="provider2" 
      url="ldap://DIFFERENT_LDAPSERVER.mycompany.intranet" 
      manager-dn="OU=std_users,OU=external_users,DC=mycompany,DC=intranet" 
      manager-password="blah"/> 

Grails中我可以配置一個AD服務器,但無法工作,如何配置一個或多個:

// LDAP config 
grails.plugin.springsecurity.ldap.context.managerDn = 'CN=blah,OU=std_users,OU=users,DC=mycompany,DC=intranet' 
grails.plugin.springsecurity.ldap.context.managerPassword = 'the_password' 
grails.plugin.springsecurity.ldap.context.server = 'ldap://theserver.mycompany.intranet' 

grails.plugin.springsecurity.ldap.authorities.ignorePartialResultException = true // typically needed for Active Directory 
grails.plugin.springsecurity.ldap.search.base = 'OU=std_users,OU=users,DC=mycompany,DC=intranet' 
grails.plugin.springsecurity.ldap.search.filter="sAMAccountName={0}" // for Active Directory you need this 
grails.plugin.springsecurity.ldap.search.searchSubtree = true 
grails.plugin.springsecurity.ldap.auth.hideUserNotFoundExceptions = false 

我知道你可以創建一個以空格分隔的服務器列表,但這對我來說不起作用,因爲它只會在連接時嘗試其中一臺服務器,而我需要它嘗試在兩者中尋找用戶。

我想我可能需要卡住resources.groovy文件,但不知道從哪裏開始 - 有沒有人配置了多個AD位置?

我唯一的想法是創建一個虛擬目錄,將所有用戶集中在一個目錄中。任何人都可以提出一個這樣做的好方法嗎?我一直在尋找http://myvd.sourceforge.net/usecases.html

任何幫助,將不勝感激。一直在使用Google進行搜索,我也沒有接近解決方案。

+0

您好,感謝回答。請將您的評論移至答案,以便您有資格獲得賞金。這使我指出了正確的方向,今天我取得了一些成功。我明天會更新。 – Cookalino 2014-10-15 16:14:38

回答

5

安德魯的答案指出我在正確的方向,我現在有這個工作。

這很容易使用ActiveDirectoryLdapAuthenticationProvider進行這項工作。這是按以下步驟進行:

在resources.groovy:

// Domain 1 
ldapAuthProvider1(ActiveDirectoryLdapAuthenticationProvider, 
     "mydomain.com", 
     "ldap://mydomain.com/" 
) 

// Domain 2 
ldapAuthProvider2(ActiveDirectoryLdapAuthenticationProvider, 
     "mydomain2.com", 
     "ldap://mydomain2.com/" 
) 

Config.groovy中:

grails.plugin.springsecurity.providerNames = ['ldapAuthProvider1', 'ldapAuthProvider2'] 

這是所有你需要的代碼。您幾乎可以刪除Config.groovy中的所有其他grails.plugin.springsecurity.ldap。*設置,因爲它們不適用於此AD設置。

對於文檔,請參閱: http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ldap-active-directory

如果您不使用AD,並希望 '純LDAP' 版本:

在resources.groovy:

// Create another ldap authentication provider 
ldapAuthProvider2(org.springframework.security.ldap.authentication.LdapAuthenticationProvider, 
     ref("ldapAuthenticator2"), 
     ref("ldapAuthoritiesPopulator") // Use default 
) { 
    // Can set other auth provider settings here 
} 

ldapAuthenticator2(org.springframework.security.ldap.authentication.BindAuthenticator, ref("contextSource2")) { 
    userSearch = ref("ldapUserSearch2") 
} 

// Set up the manager to read LDAP 
contextSource2(DefaultSpringSecurityContextSource, grailsApplication.config.grails.plugin.springsecurity.ldap.context.server2) { 
    userDn = grailsApplication.config.grails.plugin.springsecurity.ldap.context.managerDn2 // Manager DN 
    password = grailsApplication.config.grails.plugin.springsecurity.ldap.context.managerPassword2 
} 

// Configuration for searching for user 
ldapUserSearch2(FilterBasedLdapUserSearch, grailsApplication.config.grails.plugin.springsecurity.ldap.search.base2, grailsApplication.config.grails.plugin.springsecurity.ldap.search.filter2, ref('contextSource2')) { 
} 

然後在配置。常規:

// Config for second LDAP AuthenticationProvider - used in resources.groovy 
grails.plugin.springsecurity.ldap.context.managerDn2 = 'CN=MANAGER_USER,OU=Users,DC=mycompany,DC=com' 
grails.plugin.springsecurity.ldap.context.managerPassword2 = 'manager_password' 
grails.plugin.springsecurity.ldap.context.server2 = "ldap://the-ldap-server.com" 

grails.plugin.springsecurity.ldap.search.base2 = 'OU=Users,DC=mycompany,DC=com' 
grails.plugin.springsecurity.ldap.search.filter2 = "sAMAccountName={0}" // for Active Directory you need this 

// Add the AuthenticationProvider to the list 
grails.plugin.springsecurity.providerNames = ['ldapAuthProvider', 'ldapAuthProvider2'] 

此鏈接是爲尋找如何來設置這非常有用: https://github.com/grails-plugins/grails-spring-security-ldap/blob/master/SpringSecurityLdapGrailsPlugin.groovy

相關問題