首页 > 解决方案 > 如何在 spring-boot 中生成 client-id 和 client-secret 并存储在数据库中?

问题描述

我知道 stackoverflow 上已经存在类似的问题。当我浏览它们时,它并没有解决我正在寻找的问题。

我有一个spring-boot Web 服务Oaut2ClientManagement我在其中创建了一个 API,它基本上将注册一个新客户端。当新公司注册时,companyId(它是在某个company_details表中预定义的,是的,该公司已添加到列表中但未注册以访问 API)被发送,因此基于我必须生成client-id&client-secret我将存储在CLIENT_KEY_MANAGEMENT表中。基于此,我编写了一个 java 代码来生成accessToken.

所以我的问题是如何根据收到的请求生成客户端 ID客户端密钥?companyId我已经完成了这个答案。但是有没有任何预定义的方式spring-boot oauth可以完成这项工作?下一步是基于它生成访问令牌。

我还浏览了 oAuth教程。但是,在此client-id&client-secret存储在属性文件中,而不是在数据库/其他源中。也好像是单对。

如果有人可以指导我使用spring-boot.

标签: javaspring-bootspring-securityoauth-2.0spring-security-oauth2

解决方案


有一个JdbcClientDetailsService为此特定目的。

您需要在数据库中定义下表

create table oauth_client_details (
  client_id VARCHAR(256) PRIMARY KEY,
  resource_ids VARCHAR(256),
  client_secret VARCHAR(256),
  scope VARCHAR(256),
  authorized_grant_types VARCHAR(256),
  web_server_redirect_uri VARCHAR(256),
  authorities VARCHAR(256),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additional_information VARCHAR(4096),
  autoapprove VARCHAR(256)
);

并配置您的 Oauth2 授权服务器,如下所示

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

}

最后你可以JdbcClientDetailsService在你注册的位置注入 bean companyId

@Autowired
JdbcClientDetailsService jdbcClientDetailsService;

...
BaseClientDetails clientDetails = new BaseClientDetails(companyId, resourceIds, scopes, grantTypes, authorities);
clientDetails.setClientSecret("generatedpassword");
jdbcClientDetailsService.addClientDetails(clientDetails);

最后,您可以使用这些客户端凭据登录。

更新

如果您希望您的密码被散列,您可以如下设置 PasswordEncoder。

clients.jdbc(dataSource)
                .passwordEncoder(new BCryptPasswordEncoder())

BaseClientDetails可在包装中使用org.springframework.security.oauth2.provider.client

服务不会生成客户端密码。您需要生成它并将其设置为BaseClientDetails.


推荐阅读