在基于Spring Security 3.2的应用程序中,我需要根据用户名和远程IP地址中的特定模式,针对两个不同的提供程序对用户进行身份验证。
如果他们符合某些规则,则应根据ActiveDirectoryLdapAuthenticationProvider
对其进行身份验证,否则使用标准AuthenticationProvider
使用已有的UserDetailsService
自定义实施进行身份验证。
我需要扩展什么? AuthenticationManager
或AuthenticationProvider
?任何示例代码都将受到高度赞赏: - )
注意:我已经成功尝试在<authentication-provider />
中添加两个<authentication-manager />
节点,这很好用。但令我困扰的是,我的Ldap服务器因每次身份验证尝试而被击中(即使是那些不适合它的人)
答案 0 :(得分:2)
你可以创建一个包装器来检查pattern / ip-address,如果它匹配,则委托else返回null。
public class FilteringAuthenticationProvider implements AuthenticationProvider {
private final AuthenticationProvider delegate;
public FilteringAuthenticationProvider(AuthenticationProvider delegate) { this.delegate=delegate;}
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
Object details = authentication.getDetails();
String username = authentication.getPrincipal().toString();
String remoteAddress = null;
if (details instanceof WebAuthenticationDetails) {
remoteAddress = ((WebAuthenticationDetails) details).getRemoteAddress();
}
if (matches(remoteAddress, username)) {
return delegate.authenticate(authentication);
}
return null
}
private boolean matches(String remoteAddress, String Username) {
// your checking logic here
}
}
像这样的东西。然后在安全配置中对其进行配置,并将其包装ActiveDirectoryLdapAuthenticationProvider
。
<sec:authentication-manager>
<sec:authentication-provider ref="filteringLdapProvider" />
<sec:authentication-provider>
<user-service ref="customUserDetailsService" />
</sec:authentication-provider>
</sec:authentication-manager>
<bean id="filteringLdapProvider" class="FilteringAuthenticationProvider">
<constructor-arg ref="ldapProvider" />
</bean>
<bean id="ldapProvider" class="ActiveDirectoryLdapAuthenticationProvider">
...
</bean>
像这样的东西。