根据用户名和远程IP地址使用不同的AuthenticationProvider

时间:2014-01-27 13:14:21

标签: spring spring-security spring-ldap

在基于Spring Security 3.2的应用程序中,我需要根据用户名和远程IP地址中的特定模式,针对两个不同的提供程序对用户进行身份验证。

如果他们符合某些规则,则应根据ActiveDirectoryLdapAuthenticationProvider对其进行身份验证,否则使用标准AuthenticationProvider使用已有的UserDetailsService自定义实施进行身份验证。

我需要扩展什么? AuthenticationManagerAuthenticationProvider?任何示例代码都将受到高度赞赏: - )

注意:我已经成功尝试在<authentication-provider />中添加两个<authentication-manager />节点,这很好用。但令我困扰的是,我的Ldap服务器因每次身份验证尝试而被击中(即使是那些不适合它的人)

1 个答案:

答案 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>

像这样的东西。