具有多个Active Directory服务器的Grails Spring安全LDAP插件

具有多个Active Directory服务器的Grails Spring安全LDAP插件,grails,spring-security,active-directory,spring-security-ldap,Grails,Spring Security,Active Directory,Spring Security Ldap,我有GrailsSpring安全插件,可以毫无问题地连接到一个Active Directory服务器。但是,我需要连接到多个服务器。我们有一些用户在一个广告服务器上,其他用户在另一个服务器上,所以我们需要尝试在两个位置寻找用户 例如,在Java中,我的工作原理如下: <authentication-manager> <authentication-provider ref="provider1"/> <authentication-provider

我有GrailsSpring安全插件,可以毫无问题地连接到一个Active Directory服务器。但是,我需要连接到多个服务器。我们有一些用户在一个广告服务器上,其他用户在另一个服务器上,所以我们需要尝试在两个位置寻找用户

例如,在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"/>
我知道您可以创建一个以空间分隔的服务器列表,但这对我来说不起作用,因为一旦建立连接,它只会尝试其中一个服务器,而我需要它来尝试在这两个服务器中查找用户

我想我可能需要进入resources.groovy文件,但不知道从哪里开始——有人配置了多个广告位置吗

我唯一的另一个想法是创建一个虚拟目录,将所有用户聚集在一个目录中。有人能提出一个好的方法吗?我一直在看


任何帮助都将不胜感激。谷歌搜索了一整天,我还没有找到解决方案。

基本想法是在应用程序的
grails app/conf/spring/resources.groovy文件中构建第二个自定义
AuthenticationProvider
bean,然后在
ldapAuthProvider
之后对其进行建模,您可以将这个自定义LDAP验证器bean添加到
Config.groovy
(或等效)中的
grails.plugin.springsecurity.providerNames
列表中Andrew的回答为我指明了正确的方向,现在我已经可以使用它了

使用ActiveDirectoryLdapAuthenticationProvider可以更轻松地完成这项工作。具体操作如下:

<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"/>
在resources.groovy中:

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

// Domain 2
ldapAuthProvider2(ActiveDirectoryLdapAuthenticationProvider,
        "mydomain2.com",
        "ldap://mydomain2.com/"
)
// 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.groovy中:

grails.plugin.springsecurity.providerNames = ['ldapAuthProvider1', 'ldapAuthProvider2']
// 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']
这就是您需要的全部代码。您几乎可以删除Config.groovy中的所有其他grails.plugin.springsecurity.ldap.*设置,因为它们不适用于此广告设置

有关文档,请参阅:

如果您不使用AD并希望使用“纯LDAP”版本:

在resources.groovy中:

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

// Domain 2
ldapAuthProvider2(ActiveDirectoryLdapAuthenticationProvider,
        "mydomain2.com",
        "ldap://mydomain2.com/"
)
// 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.groovy中:

grails.plugin.springsecurity.providerNames = ['ldapAuthProvider1', 'ldapAuthProvider2']
// 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']
此链接对于了解如何设置非常有用:

嗨,谢谢你的回答。请将您的评论移至答案,以便您有资格获得赏金。这为我指明了正确的方向,我今天在这方面取得了一些成功。明天我会更新更多。