我正在使用LDAP进行身份验证,一切都适用于特定域中的用户。但是我很难理解如何验证第二个域下的用户。我在下面显示的当前配置指定了user-search-base中的第一个域。我删除了该参数,希望它能搜索所有域,但这不起作用。我还尝试在提示时将域指定为用户名的一部分,例如domain \ user,但这也不起作用。
<security:authentication-manager alias="authenticationManager">
<security:ldap-authentication-provider
user-search-filter="(samaccountname={0})"
user-search-base="dc=domain,dc=company,dc=com"
user-context-mapper-ref="userContextMapper" >
</security:ldap-authentication-provider>
</security:authentication-manager>
<security:ldap-server
url="ldap://some.url.com:3000"
manager-dn="CN=USER1,OU=FacMgr,OU=FAC,OU=Exchange,dc=domain,dc=company,dc=com"
manager-password="xxxx"/>
我是否需要创建自定义搜索,如果是,有人可以在此上下文中提供示例吗?
答案 0 :(得分:0)
好像你正在使用Active Directory,在这种情况下我想知道为什么你没有使用更基本的ActiveDirectoryLdapAuthenticationProvider类。
无论如何,您应该能够通过扩展LdapAuthenticationProvider或ActiveDirectoryLdapAuthenticationProvider,并将适当的域传递给超类的方法来完成您的需要。
创建一个接受两个不同LdapAuthenticator对象的构造函数,并在doAuthentication
方法的catch (UsernameNotFoundException notFound)
语句中添加第二个'try'语句(在检查错误凭据之后)。如果第一个验证器失败,请使用您喜欢的任何方法来获取getAuthenticator
方法来尝试第二个验证器。
这种方法应该有效,但如果两个域都有jsmith
的用户名,但有问题的用户位于第二个域,则可能会遇到问题 - 也就是说,这不是特别好的解决方案,但它是的解决方案。
要正确构建此功能,请使用自定义身份验证筛选器(扩展UsernamePasswordAuthenticationFilter),并使用LdapAuthenticationProvider.getAuthenticator()
方法从筛选器传递的值(在自定义登录表单中)中识别域。
您可能需要不同的经理帐户,但这足以让您继续使用。
答案 1 :(得分:0)
使这项工作的诀窍是使用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设置。