Spring Boot / Spring安全性选择基于路径的多个身份验证提供程序

时间:2017-05-19 20:54:18

标签: java spring spring-boot spring-security

我已经配置了我的应用程序:

我有两个身份验证提供程序(provider1和provider2),我想将它们用于不同的端点:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/api/v1").authenticated();
    http.authorizeRequests().antMatchers("/api/v2").authenticated();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(provider1);
    auth.authenticationProvider(provider2);
}

现在发生的事情是,如果我调用/api/v2 provider1被调用,如果没有引发异常或返回false,那么只会调用provider2

// In org.springframework.security.authentication.ProviderManager

for (AuthenticationProvider provider : getProviders()) {
        try {
            result = provider.authenticate(authentication);

            if (result != null) {
                copyDetails(authentication, result);
                break;
            }
        }
        ...
        ...
}

如何点击provider2时才调用/api/v2

这样的事情:

http.authorizeRequests().antMatchers("/api/v2")
    .authenticated().authenticationProvider(provider2);

(我知道authenticationProvider上有HttpSecurity,但与调用AuthenticationManagerBuilder#authenticationProvider完全相同

1 个答案:

答案 0 :(得分:0)

您可以向Spring Security过滤器链添加自定义过滤器,尝试使用自定义Authentication实施来授权请求​​。当您致电AuthenticationManager.authenticate()时,您可以传入自定义身份验证的实例。然后,请确保更新自定义提供程序的支持(Class<?>身份验证)方法,以仅接受自定义身份验证类。

然后,您可以使用antmatcher将自定义过滤器应用于特定端点的安全过滤器链。