具有多个 Active Directory 服务器的 Grails Spring Security LDAP 插件
Posted
技术标签:
【中文标题】具有多个 Active Directory 服务器的 Grails Spring Security LDAP 插件【英文标题】:Grails Spring Security LDAP plugin with multiple Active Directory servers 【发布时间】:2014-11-30 20:34:56 【问题描述】:我的 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
任何帮助将不胜感激。整天都在谷歌上搜索,我离解决方案还差得远。
【问题讨论】:
您好,感谢您的回答。请将您的评论移至答案,以便您有资格获得赏金。这为我指明了正确的方向,我今天在这方面取得了一些成功。我明天会更新更多。 【参考方案1】:Andrew 的回答为我指明了正确的方向,我现在可以正常工作了。
使用 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
【讨论】:
【参考方案2】:基本思想是在应用程序的grails-app/conf/spring/resources.groovy
文件中构造第二个自定义AuthenticationProvider
bean,可能在https://github.com/grails-plugins/grails-spring-security-ldap/blob/master/SpringSecurityLdapGrailsPlugin.groovy 中的ldapAuthProvider
之后对其进行建模然后,您可以将此自定义LDAP 身份验证器bean 添加到@ 987654325@Config.groovy
中的列表(或等效项)
【讨论】:
以上是关于具有多个 Active Directory 服务器的 Grails Spring Security LDAP 插件的主要内容,如果未能解决你的问题,请参考以下文章
Active Directory 真的符合 LDAP 标准吗?
具有错误的Active Directory Ldap凭据的会话/ Redis序列化错误的Spring启动
具有自定义角色的 Shiro Active Directory