我是否可以配置Spring Security以提示输入域名以及用户名和密码

时间:2013-04-29 17:32:13

标签: spring-security spring-ldap

我正在使用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"/>

我是否需要创建自定义搜索,如果是,有人可以在此上下文中提供示例吗?

2 个答案:

答案 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设置。

文档: http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ldap-active-directory