java - 如何在spring-boot中生成client-id和client-secret并存储在数据库中?

标签 java spring-boot spring-security oauth-2.0 spring-security-oauth2

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

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

所以我的问题是如何根据我在请求中收到的 companyId 生成 client-idclient-secret ?我经历过这个answer 。但是 spring-boot oauth 中是否有任何预定义的方法可以完成这项工作?下一步是根据它生成访问 token 。

我还通过了oAuth tutorial 。但是,在此 client-idclient-secret 存储在属性文件中,而不是数据库/其他源中。看起来也像是单对。

如果有人可以指导我使用 spring-boot 实现上述场景,那就太好了。

最佳答案

有一个用于此特定目的的 JdbcClientDetailsS​​ervice

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

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) JdbcClientDetailsS​​ervice 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/

相关文章:

java - 如何在安全 xml 中配置 BCryptPasswordEncoder

spring - 如何在spring webflux中重定向请求?

Spring Security 基于用户的权限? (不基于角色)

spring-security - Spring ActiveDirectoryLdapAuthenticationProvider handleBindException - 提供的密码无效错误

java - 将 Spring Security 与线程池结合使用会导致重用线程时出现竞争条件

java - Spring security Saml - SP和IDP的时间差

java - 应用程序服务器如何跟踪 HttpSession 对象和客户端?

java - 当 Log4j 创建 java.io.FileOutputStream 时,如何使用 Powermockito 模拟 java.io.FileOutputStream?

java - 编写一个读取二进制文件的方法

maven - 在 STS - spring 工具套件中,war 文件未显示添加到 tomcat 中?