我有一个应用程序,由两组用户 - 内部用户用于公司和外部客户。 我必须为两组用户执行身份验证。应用程序将使用Spring Security构建。 对于内部用户,需要完成LDAP AD身份验证。对于外部用户,将从数据库进行身份验证。我被困在这里。
如何使用这两种身份验证?用户可以根据他们的电子邮件ID进行区分 - 例如,内部用户都将拥有以@ company.com结尾的电子邮件ID。
在Spring安全配置中,可以这样做吗? -
<authentication-manager>
<authentication-provider>
<ldap-authentication-provider....>
<db-authentication-provider......>
</authentication-provider>
<authentication-manager>
那么我应该编写一个过滤器(在spring安全过滤器之前)根据他们的登录电子邮件ID选择用户并将他们引导到正确的身份验证管理器吗?这种重定向是否可以在这里完成?
我是新手。谢谢。
答案 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。棘手的部分是UserDetailsService,因为我有一个无状态应用程序,当我不知道哪个身份验证提供程序用于身份验证时,我必须弄清楚要使用哪个应用程序。我写了一些自定义的东西来处理它。
答案 2 :(得分:0)
我有一个相对问题。 我目前正在开发一个应用程序,该应用程序将具有添加,删除,更新用户的功能。这是一个小型Web应用程序。你喜欢哪个? LDAP验证或基于MYSQL的验证(所有用户信息都保存在DB中)。我对MYSQL感到更自在,因为我以前从未使用过LDAP自动验证。