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

标签 grails spring-security active-directory spring-security-ldap

我将 Grails Spring Security 插件连接到一台 Active Directory 服务器,没有任何问题。但是,我需要连接到多个服务器。我们在一台 AD 服务器上有一些用户,而在另一台服务器上有其他用户,因此我们需要尝试在两个位置查找用户。

例如,在 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

任何帮助,将不胜感激。一整天都在谷歌上搜索,我离解决方案更近了。

最佳答案

安德鲁的回答为我指明了正确的方向,我现在有这个工作。

使用 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.groovy 中:
// 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

关于具有多个 Active Directory 服务器的 Grails Spring Security LDAP 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26218684/

相关文章:

Grails Controller /集成测试成功但永远挂起

jquery - jQuery\Grails表单提交在IE中不起作用

spring - spring security 3.1.2.RELEASE 中的 sessionManagementFilter

Powershell,如何检查 AD 用户的组成员身份

asp.net-mvc - ASP.NET MVC Windows Azure 组织身份验证

grails - grails run-app 的 Intellij IDEA 14 错误

database - Grails:另一个表中的两个主键引用

java - Spring Boot Spring WebFlux 安全配置从属性文件加载凭据

java - 不同端口上的多个 Spring Boot 实例 - 登录/注销问题

java - spring security中如何获取所有LDAP组