首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring Oauth2 JDBC客户端配置多次添加同一客户端

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

Stack Overflow用户
提问于 2016-10-20 20:28:15
回答 4查看 1.5K关注 0票数 1

我正在一个Spring项目中配置一个OAuth2授权服务器。以下是配置。

代码语言:javascript
运行
复制
 @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")
        }

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

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2018-11-17 06:12:04

我解决了这个问题,首先显式删除客户端详细信息,然后重新添加它们,如下所示:

代码语言:javascript
运行
复制
// 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);

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

票数 1
EN

Stack Overflow用户

发布于 2019-08-12 18:49:03

请查找my answer,它将在没有任何错误的情况下工作:

找到下面的代码

代码语言:javascript
运行
复制
@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
EN

Stack Overflow用户

发布于 2019-08-12 19:48:48

请找到我的答案,它将工作,没有任何错误:https://stackoverflow.com/a/57460575/9963016

找到下面的代码

@Override public void configure(ClientDetailsServiceConfigurer configurer)引发异常{

代码语言:javascript
运行
复制
    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40154466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档