我已经配置了我的应用程序:
我有两个身份验证提供程序(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
完全相同
答案 0 :(得分:0)
您可以向Spring Security过滤器链添加自定义过滤器,尝试使用自定义Authentication实施来授权请求。当您致电AuthenticationManager.authenticate()时,您可以传入自定义身份验证的实例。然后,请确保更新自定义提供程序的支持(Class<?>身份验证)方法,以仅接受自定义身份验证类。
然后,您可以使用antmatcher将自定义过滤器应用于特定端点的安全过滤器链。