我正在使用Spring安全性设置OAuth2 + OpenID连接服务器。我一直在尝试使用在类上使用@EnableAuthorizationServer批注时定义的自动 / oauth / token 和 / oauth / authorize 端点。
@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter{
在同一个类中,我已经自动连接了AuthenticationManager以用于配置AuthorizationServerEndpointsConfigurer。我已经调试并确认正确的bean正在自动接线。
@Autowired
private AuthenticationManager authMan;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception{
endpoints
.tokenStore(tokenStore())
.userApprovalHandler(userApprovalHandler())
.authenticationManager(authMan);
}
问题是,正在创建两个WebSecurityConfigurer,一个是我定义的,另一个是默认的WebSecurityConfigurer。这是我定义的内容的一部分:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private UserDetailsSrvc detailsSrvc;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider
= new DaoAuthenticationProvider();
authProvider.setUserDetailsService(detailsSrvc);
authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
}
@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
@Override
@Bean(name="myAuthenticationManager")
public AuthenticationManager authenticationManagerBean() throws Exception {
return authenticationManager();
}
不幸的是,当我使用浏览器导航到localhost:8080 / outh / token时,将调用默认值。我可以知道,因为在身份验证过程中未使用我的自定义UserDetailsService,并且因为我在org.springframework.security.config.annotation.web.configuration.AutowiredWebSecurityConfigurersIgnoreParents中的getWebSecurityConfigurers方法上放置了一个断点:
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<SecurityConfigurer<Filter, WebSecurity>> getWebSecurityConfigurers() {
List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers = new ArrayList<SecurityConfigurer<Filter, WebSecurity>>();
Map<String, WebSecurityConfigurer> beansOfType = beanFactory
.getBeansOfType(WebSecurityConfigurer.class);
for (Entry<String, WebSecurityConfigurer> entry : beansOfType.entrySet()) {
webSecurityConfigurers.add(entry.getValue());
}
return webSecurityConfigurers;
}
beansOfType映射具有两个条目,但是仅当我具有带有@EnableAuthorizationServer批注的类时。 (如果我注释掉注释,则为1)
如何获取AuthorizationServerConfigurerAdapter(或实际上正在处理对/ oauth / token的请求的任何内容)以使用在WebSecurityConfigurerAdapter中定义的WebSecurityConfigurer?我相信我可以通过定义自己的端点来解决此问题,也许这是唯一的解决方案,但是我希望利用默认端点。