我正在一个Spring项目中配置一个OAuth2授权服务器。以下是配置。
 @Override
public void configure(ClientDetailsServiceConfigurer clients) 
  throws Exception {
    clients.jdbc(dataSource)
           .withClient("user")
           .secret("secret")
           .scopes("read", "write")
           .autoApprove(true)
           .authorizedGrantTypes(
            "password","authorization_code", "refresh_token")
        }问题是,每次我重新启动应用程序时,它都会尝试将这些客户端添加到数据库中,这是我不想要的。我得到了唯一的约束冲突异常。如何将其配置为仅在客户端尚不存在时才添加客户端?
谢谢。
发布于 2018-11-17 06:12:04
我解决了这个问题,首先显式删除客户端详细信息,然后重新添加它们,如下所示:
// Create client details
BaseClientDetails clientDetails = new BaseClientDetails();
clientDetails.setClientId("user");
clientDetails.setClientSecret("secret");
clientDetails.setScope(Arrays.asList("read", "write"));
clientDetails.setAuthorizedGrantTypes(Arrays.asList("password","authorization_code", "refresh_token"));
// Remove and re-add details
JdbcClientDetailsService jdbcClientDetailsService = new JdbcClientDetailsService(dataSource);
try {
    jdbcClientDetailsService.removeClientDetails(clientDetails.getClientId());
} catch (NoSuchClientException ignored) {
}
jdbcClientDetailsService.addClientDetails(clientDetails);
// Configure clients
clients.withClientDetails(jdbcClientDetailsService);您可以使用此代码完全替换原始问题中包含的方法体。
发布于 2019-08-12 18:49:03
请查找my answer,它将在没有任何错误的情况下工作:
找到下面的代码
@Override
public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
    JdbcClientDetailsService jdbcClientDetailsService = new JdbcClientDetailsService(dataSource);
    if(!jdbcClientDetailsService.listClientDetails().isEmpty() ) {          
    jdbcClientDetailsService.removeClientDetails(CLIEN_ID);     
    }
    if(jdbcClientDetailsService.listClientDetails().isEmpty() ) {
        configurer.jdbc(dataSource).withClient(CLIEN_ID).secret(encoder.encode(CLIENT_SECRET))
        .authorizedGrantTypes(GRANT_TYPE_PASSWORD, AUTHORIZATION_CODE, REFRESH_TOKEN, IMPLICIT)
        .scopes(SCOPE_READ, SCOPE_WRITE, TRUST).accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS)
        .refreshTokenValiditySeconds(FREFRESH_TOKEN_VALIDITY_SECONDS).and().build();                
    }       
    configurer.jdbc(dataSource).build().loadClientByClientId(CLIEN_ID); 
}发布于 2019-08-12 19:48:48
请找到我的答案,它将工作,没有任何错误:https://stackoverflow.com/a/57460575/9963016
找到下面的代码
@Override public void configure(ClientDetailsServiceConfigurer configurer)引发异常{
    JdbcClientDetailsService jdbcClientDetailsService = new JdbcClientDetailsService(dataSource);
    if(!jdbcClientDetailsService.listClientDetails().isEmpty() ) {          
    jdbcClientDetailsService.removeClientDetails(CLIEN_ID);     
    }
    if(jdbcClientDetailsService.listClientDetails().isEmpty() ) {
        configurer.jdbc(dataSource).withClient(CLIEN_ID).secret(encoder.encode(CLIENT_SECRET))
        .authorizedGrantTypes(GRANT_TYPE_PASSWORD, AUTHORIZATION_CODE, REFRESH_TOKEN, IMPLICIT)
        .scopes(SCOPE_READ, SCOPE_WRITE, TRUST).accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS)
        .refreshTokenValiditySeconds(FREFRESH_TOKEN_VALIDITY_SECONDS).and().build();                
    }       
    configurer.jdbc(dataSource).build().loadClientByClientId(CLIEN_ID); 
}https://stackoverflow.com/questions/40154466
复制相似问题