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

时间:2016-10-20 12:28:15

标签: java oauth-2.0 spring-jdbc spring-oauth2

我正在Spring项目中配置OAuth2授权服务器。这是配置。

E = eye(max(y));
Y = E(y,:);

问题是每次重新启动应用程序时,它都会尝试在数据库中添加这些客户端,这是我不想要的。我收到了唯一约束违规异常。如何将其配置为仅在客户端尚不存在时添加客户端?

感谢。

4 个答案:

答案 0 :(得分:1)

请找到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); 
}

答案 1 :(得分:0)

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

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

解决方案: 只需要这条线你的方法。它会在该表中找到该行。 @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.jdbc(dataSource); } 假设您第一次使用上面的行启动应用程序,那么我猜您可以直接在该表中添加条目,也可以通过应用程序添加它。

我手动添加以进行测试。

希望这对你有所帮助。它对我有用。

答案 2 :(得分:0)

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

// Create client details
BaseClientDetails clientDetails = new BaseClientDetails();
clientDetails.setClientId("user");
clientDetails.setClientId("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);

您可以使用此代码完全替换原始问题中包含的方法的正文。

答案 3 :(得分:0)

请找到我的答案,它将正常工作:https://stackoverflow.com/a/57460575/9963016

找到下面的代码

@Override     公共无效configure(ClientDetailsS​​erviceConfigurer 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); 
}