Spring: ошибка API Mvc Rest = «invalid_grant», error_description = «неверные учетные данные» в Spring oauth2 jdbc - PullRequest
0 голосов
/ 23 мая 2018

Я хотел бы реализовать защиту для API Spring Rest API с использованием OAth2, и я очень новичок в этих концепциях.Я реализовал эту концепцию с использованием InMemoryAuthentication, и она отлично работает, но я пытаюсь сделать с аутентификацией JDBC.После поиска такого количества учебников в Google я ввел аутентификацию jdbc, но она выдает ошибку, и я не знаю, как это сделать. Мой код выглядит следующим образом. Я не уверен, правильный ли мой поток или нет, пожалуйста, исправьте меня.

Класс AuthorizationServerConfig

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

@Autowired
private TokenStore tokenStore;

@Autowired
private UserApprovalHandler userApprovalHandler;

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

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws 
Exception {
    clients.inMemory()
    .withClient("crmClient1")
        .secret("crmSuperSecret")
        .authorizedGrantTypes("password", "refresh_token")
        .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
        .scopes("read", "write", "trust")
        //.accessTokenValiditySeconds(ONE_DAY)
        .accessTokenValiditySeconds(300)
        .refreshTokenValiditySeconds(THIRTY_DAYS);
}

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

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.realm(REALM);
}
}

Класс ResourceServerConfig

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

@Override
public void configure(HttpSecurity http) throws Exception {
    //-- define URL patterns to enable OAuth2 security
    http.
    anonymous().disable()
    .requestMatchers().antMatchers("/api/**")
    .and().authorizeRequests()
    .antMatchers("/api/**").access("hasRole('ADMIN') or hasRole('USER')")
    .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
}

}

Класс SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private ClientDetailsService clientDetailsService;

@Autowired
private DataSource dataSource;

@Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
    System.out.println("data source : " + dataSource.getConnection().isClosed());
    auth.jdbcAuthentication().dataSource(dataSource)
            .usersByUsernameQuery("select username,password from users where username=?");
    /*auth.jdbcAuthentication().dataSource(dataSource)
            .authoritiesByUsernameQuery("select username, role from user_roles where username =?");*/

}


 /* @Autowired 
  public void globalUserDetails(AuthenticationManagerBuilder
  auth) throws Exception {
  //System.out.println("Auth : "+auth.inMemoryAuthentication().toString());
  auth.inMemoryAuthentication()
 .withUser("crmadmin").password("crmpass").roles("ADMIN","USER").and()
 .withUser("crmuser").password("pass123").roles("USER");
  }*/


@Override
@Order(Ordered.HIGHEST_PRECEDENCE)
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().csrf().disable()
            .authorizeRequests().antMatchers("/about").permitAll().antMatchers("/signup").permitAll()
            .antMatchers("/oauth/token").permitAll()
            // .antMatchers("/api/**").authenticated()
            // .antMatchers("/api/**").hasRole("USER")
            .anyRequest().authenticated().and().httpBasic().realmName("CRM_REALM");
}

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

@Bean
public TokenStore tokenStore() {
    return new  JdbcTokenStore(dataSource);
}

@Bean
@Autowired
public TokenStoreUserApprovalHandler userApprovalHandler(TokenStore tokenStore) {
    TokenStoreUserApprovalHandler handler = new TokenStoreUserApprovalHandler();
    handler.setTokenStore(tokenStore);
    handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientDetailsService));
    handler.setClientDetailsService(clientDetailsService);
    return handler;
}

@Bean
@Autowired
public ApprovalStore approvalStore(TokenStore tokenStore) throws Exception {
    TokenApprovalStore store = new TokenApprovalStore();
    store.setTokenStore(tokenStore);
    return store;
}

}

РЕЗУЛЬТАТЫ ПОСТМАНА

enter image description here enter image description here

1 Ответ

0 голосов
/ 17 августа 2018

Вы также должны указать client_id и client_secret в теле запроса.В вашем случае ваш client_id - это «crmClient1», а ваш client_secret - «crmSuperSecret».

...