带有自定义AuthenticationManager的Spring EnableAuthorizationServer

时间:2019-01-25 00:42:50

标签: spring-security oauth-2.0 javabeans

我正在使用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时,将调用默认值。我可以知道,因为在身份验证过程中未使用我的自定义UserDetailsS​​ervice,并且因为我在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?我相信我可以通过定义自己的端点来解决此问题,也许这是唯一的解决方案,但是我希望利用默认端点。

0 个答案:

没有答案