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

相关问题