Java Spring Oauth2 JDBC客户端配置多次添加同一个客户端

Java Spring Oauth2 JDBC客户端配置多次添加同一个客户端,java,oauth-2.0,spring-jdbc,spring-oauth2,Java,Oauth 2.0,Spring Jdbc,Spring Oauth2,我正在Spring项目中配置OAuth2授权服务器。这里是配置 @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.jdbc(dataSource) .withClient("user") .secret("secret") .scopes("read", "write"

我正在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")
        }
问题是,每次我重新启动应用程序时,它都试图在数据库中添加那个些我不想要的客户端。我得到了唯一的约束冲突异常。如何将其配置为仅在客户端不存在时才添加客户端

谢谢。

原因: 所以基本上当应用程序启动时,它会将withClient()中的内容插入oauth_client_details表中,所以请删除该内容并重新启动应用程序,它应该可以工作

由于您已经运行了应用程序,它在oauth_client_details表中插入了行

解决方案: 这条线就是你的方法。它将找到该表中的行。

@凌驾
公共无效配置(ClientDetailsServiceConfigurer客户端)引发异常
{
jdbc(数据源);
}
假设您第一次使用上面的行启动应用程序,那么我猜您可以直接将条目添加到该表中,或者也可以通过应用程序添加条目

我手动添加用于测试目的


希望这对你有帮助。它对我很有效。

我解决了这个问题,首先明确删除了客户端详细信息,然后像这样重新添加它们:

// 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);
您可以使用此代码完全替换原始问题中包含的方法体。

请发现它可以正常工作,没有任何错误:

找到下面的代码

@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); 
}

请找到我的答案,它将不会出现任何错误:

找到下面的代码

@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); 
}
@凌驾 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); 
}

请编辑代码的降价,将答案始终放在上下文中,而不仅仅是粘贴代码。有关详细信息,请参阅。@gehbiszumeis ok,先生,谢谢您提供的信息。我是StackOverflow新手。我会提高自己。虽然此代码可能会回答问题,但提供有关如何和/或为什么解决此问题的附加上下文将提高效率我相信答案的长期价值。