我知道 stackoverflow 上已经存在类似的问题。当我浏览它们时,它没有解决我正在寻找的问题。
我有一个spring-boot Web服务作为Oaut2ClientManagement
,我在其中创建了一个API,它基本上会注册一个新客户端。
当新公司注册时,companyId
(它在某些 company_details
表中预定义,是的,该公司已添加到列表中,但未注册以访问 API)因此基于我必须生成 client-id
和 client-secret
并将其存储在 CLIENT_KEY_MANAGEMENT
表中。基于此,我编写了一段java代码来生成accessToken
。
所以我的问题是如何根据我在请求中收到的 companyId
生成 client-id 和 client-secret ?我经历过这个answer 。但是 spring-boot oauth 中是否有任何预定义的方法可以完成这项工作?下一步是根据它生成访问 token 。
我还通过了oAuth tutorial 。但是,在此 client-id
和 client-secret
存储在属性文件中,而不是数据库/其他源中。看起来也像是单对。
如果有人可以指导我使用 spring-boot
实现上述场景,那就太好了。
最佳答案
有一个用于此特定目的的 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);
}
}
最后,您可以在注册 companyId
的位置注入(inject) JdbcClientDetailsService
bean。
@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
中找到。
客户端 key 不会由服务生成。您需要生成它并将其设置为BaseClientDetails
。
关于java - 如何在spring-boot中生成client-id和client-secret并存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58499410/