在Spring Security中使用LDAP和DB身份验证

时间:2014-09-08 16:37:30

标签: spring-mvc authentication spring-security

我有一个应用程序,由两组用户 - 内部用户用于公司和外部客户。 我必须为两组用户执行身份验证。应用程序将使用Spring Security构建。 对于内部用户,需要完成LDAP AD身份验证。对于外部用户,将从数据库进行身份验证。我被困在这里。

如何使用这两种身份验证?用户可以根据他们的电子邮件ID进行区分 - 例如,内部用户都将拥有以@ company.com结尾的电子邮件ID。

  1. 在Spring安全配置中,可以这样做吗? -

    <authentication-manager>
            <authentication-provider>
                <ldap-authentication-provider....>
                <db-authentication-provider......>  
            </authentication-provider>
    <authentication-manager>
    
  2. 那么我应该编写一个过滤器(在spring安全过滤器之前)根据他们的登录电子邮件ID选择用户并将他们引导到正确的身份验证管理器吗?这种重定向是否可以在这里完成?

  3. 我是新手。谢谢。

3 个答案:

答案 0 :(得分:2)

我早就回答了这个问题。在将资源整合在一起后,我实现了这一点。随着时间的推移,我忘记了这个帖子。 奇怪的是时间过得真快! 无论如何,刚回来分享这个问题的答案。 实现此解决方案的一种方法是使用多个身份验证提供程序

由于最初的问题是使用基于XML的配置,我将继续这样做。 (我自己现在使用基于Java的配置。稍后会尝试添加基于java的解决方案。)

首先在security.xml中添加以下内容 - spring security的主配置文件。

<authentication-manager>            
    <authentication-provider ref="customJdbcAuthProvider" />
    <authentication-provider ref="customLdapAuthProvider" />            
</authentication-manager>

接下来需要将2个bean添加到security.xml中,这将实现支持功能。

security.xml中的条目:

<bean:bean id="customJdbcAuthProvider" class="com.springapp.myapp.setup.CustomJdbcAuthProvider" />
<bean:bean id="customLdapAuthProvider" class="com.springapp.myapp.setup.CustomLdapAuthProvider" />

最后是豆子本身。 Bean应该实现org.springframework.security.authentication.AuthenticationProvider接口。

public class CustomJdbcAuthProvider implements AuthenticationProvider {
@Override
    public Authentication authenticate(Authentication authObj)
            throws AuthenticationException {    

            // code snippet to authenticate against DB
            }

            }
}

和相应的bean来处理Ldap身份验证。我曾使用扩展的bean的org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider接口。 Spring也提供其他API实现。

public class CustomActiveDirectoryLdapAuthenticationProvider extends AbstractLdapAuthenticationProvider {
  // code snippet to authenticate and authorize against company or local LDAP or Active Directory.
}

这应该可以解决问题,让你跑步!! 如果您需要更多详细信息,请与我们联系。

答案 1 :(得分:1)

我做了一些非常相似的事情。我有一个公司LDAP服务器和一个本地内存数据库用于测试。我向其他人描述了我的解决方案here。棘手的部分是UserDetailsS​​ervice,因为我有一个无状态应用程序,当我不知道哪个身份验证提供程序用于身份验证时,我必须弄清楚要使用哪个应用程序。我写了一些自定义的东西来处理它。

答案 2 :(得分:0)

我有一个相对问题。 我目前正在开发一个应用程序,该应用程序将具有添加,删除,更新用户的功能。这是一个小型Web应用程序。你喜欢哪个? LDAP验证或基于MYSQL的验证(所有用户信息都保存在DB中)。我对MYSQL感到更自在,因为我以前从未使用过LDAP自动验证。