title: Spring Boot OAuth2 with JDBC Using Custom UserDetailService
body: <p>I am trying to secure my Spring Boot Rest API using OAuth2.0 with Spring security and want to store OAuth tokens (Access Token and Refresh Token) in JDBC database.
  For Username and Password validation i have created CustomUserDetailService.</p>
  
  <p><strong>I am getting following error-</strong></p>
  
  <pre><code>{
    "timestamp": 1480042650103,
    "status": 401,
    "error": "Unauthorized",
    "message": "Bad credentials",
    "path": "/oauth/token"
  }
  </code></pre>
  
  <p>My Code is -</p>
  
  <p><strong>Oauth2Config</strong></p>
  
  <pre><code>@Configuration
  @EnableAuthorizationServer
  @EnableResourceServer
  public class AuthorizationServerConfiguration {
  
      @Configuration
      @EnableResourceServer
      protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
  
          @Autowired
          private TokenStore tokenStore;
  
  
          @Override
          public void configure(ResourceServerSecurityConfigurer resources) {
              resources.tokenStore(tokenStore);
          }
  
          @Override
          public void configure(HttpSecurity http) throws Exception {
              http
              .anonymous().disable()
              .authorizeRequests().anyRequest().authenticated();
          }
      }
  
      @Configuration
      @EnableAuthorizationServer
      protected static class OAuth2ServerConfiguration extends AuthorizationServerConfigurerAdapter {
  
          @Autowired
          private AuthenticationManager authenticationManager;
  
          @Autowired
          private DataSource dataSource;
  
          private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
  
          @Autowired
          private CustomUserDetailService customUserDetailService;
  
          @Bean
          public JdbcTokenStore tokenStore() {
              return new JdbcTokenStore(dataSource);
          }
  
          @Bean
          protected AuthorizationCodeServices authorizationCodeServices() {
              return new JdbcAuthorizationCodeServices(dataSource);
          }
  
          @Override
          public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
              security.passwordEncoder(passwordEncoder);
          }
  
          @Override
          public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
              endpoints
                  .authorizationCodeServices(authorizationCodeServices())
                  .authenticationManager(authenticationManager)
                  .tokenStore(tokenStore())
                  .approvalStoreDisabled()
                  .userDetailsService(customUserDetailService);
          }
  
          @Override
          public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
              clients
                  .jdbc(dataSource);
          }
  
      }
  }
  </code></pre>
  
  <p><strong>WebSecurityConfig</strong></p>
  
  <pre><code>@Configuration
  @EnableWebSecurity
  @EnableGlobalMethodSecurity(prePostEnabled = true)
  class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
  
      @Autowired
      private UserDetailsService userDetailsService;
  
  
      @Autowired
      public void configure(AuthenticationManagerBuilder auth) throws Exception {  
          auth
          .userDetailsService(userDetailsService)
          .passwordEncoder(new BCryptPasswordEncoder());
      }
  
      @Override
      @Bean
      public AuthenticationManager authenticationManagerBean() throws Exception {
          return super.authenticationManagerBean();
      }
  
  }
  </code></pre>
  
  <p><strong>CustomUserDetailService</strong></p>
  
  <pre><code>@Service
  public class CustomUserDetailService 
      implements UserDetailsService {
  
      @Override
      public UserDetailsService loadUserByUsername(String username) throws UsernameNotFoundException {
          // I tested this logic and works fine so i avoid this lines
          return userDetailsService;
      }
  }
  </code></pre>
  
  <p><strong>application.properties</strong></p>
  
  <pre><code>security.oauth2.client.client-id=my-trusted-client
  security.oauth2.client.client-secret=secret
  security.oauth2.client.authorized-grant-types=password,refresh_token,authorization_code,implicit
  security.oauth2.client.scope=read,write,trust
  security.oauth2.client.resource-ids=oauth2-resource
  security.oauth2.client.access-token-validity-seconds=120
  security.oauth2.client.refresh-token-validity-seconds=600
  </code></pre>
  
  <p>Please suggest me how can i solve this error ??</p>