简体   繁体   English

Spring OAuth2 令牌请求中的 StackOverflowError

[英]StackOverflowError in Spring OAuth2 token request

I have problems implementing OAuth2 with Spring...我在使用 Spring 实现 OAuth2 时遇到问题...

This is my Configuration related to Security:这是我与安全相关的配置:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
public final void configure(final HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests().antMatchers("/oauth/token").anonymous();
    http.authorizeRequests()
        .antMatchers("/**").fullyAuthenticated();
}

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {

    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    @Autowired
    private IUserService customUserService;

    @Bean
    public UserDetailsService userDetailsService() {
        return customUserService;
    }

    @Autowired
    private IClientOAuth2DetailsService customClientDetailsService;

    @Bean
    public ClientDetailsService clientDetailsService() throws Exception {
        return customClientDetailsService;
    }

    @Override
    public final void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public final void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(clientDetailsService());
    }
}
}

Like you can see, I made my own implementation of ClientDetailsService:如您所见,我自己实现了 ClientDetailsS​​ervice:

private ClientDetailsService internalClientDetailsService;

public ClientOAuth2DetailsServiceImpl() throws Exception {
            internalClientDetailsService = new InMemoryClientDetailsServiceBuilder().withClient("admin")
                .secret("admin")
                .authorizedGrantTypes("password")
                .authorities("ROLE_CLIENT")
            .and()
            .build();
}

@Override
public final ClientDetails loadClientByClientId(final String client) throws ClientRegistrationException {
    return internalClientDetailsService.loadClientByClientId(client);
}

I'm using Postman extension in Chrome to test the oauth/token request:我在 Chrome 中使用 Postman 扩展来测试 oauth/token 请求: 邮递员请愿书

When I send my request, it seems that the ClientDetailsService works fine but after return the ClientDetails, I'm always getting this stacktrace:当我发送请求时,ClientDetailsS​​ervice 似乎工作正常,但在返回 ClientDetails 后,我总是收到此堆栈跟踪:

java.lang.StackOverflowError: null
    at java.lang.ReflectiveOperationException.<init>(Unknown Source) ~[na:1.8.0_45]
    at java.lang.reflect.InvocationTargetException.<init>(Unknown Source) ~[na:1.8.0_45]
    at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_45]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at com.sun.proxy.$Proxy67.authenticate(Unknown Source) ~[na:na]
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:192) ~[spring-security-core-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:436) ~[spring-security-config-3.2.8.RELEASE.jar:3.2.8.RELEASE]
    at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_45]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201) ~[spring-aop-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at com.sun.proxy.$Proxy67.authenticate(Unknown Source) ~[na:na]
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:192) ~[spring-security-core-4.0.3.RELEASE.jar:4.0.3.RELEASE]

I don't understand why... What I'm missing?我不明白为什么......我错过了什么?

Thanks!谢谢!

Solved!解决了!

I was missing this method where you have to configure the AuthenticationManager:我错过了您必须配置 AuthenticationManager 的这种方法:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    ...
}

Resolved by changing this method authenticationManagerBean通过改变这个方法来解决authenticationManagerBean

@Bean
    @Override
    public AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    }

---Fix--- ---修复---

@Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM