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

fumotvh3  于 2023-10-20  发布在  Spring
关注(0)|答案(2)|浏览(172)

我知道类似的问题已经存在于stackoverflow上。当我翻阅它们时,它并没有解决我正在寻找的问题。
我有一个spring-boot web service作为Oaut2ClientManagement,我在其中创建了一个API,它基本上会注册一个新的客户端。当新公司注册时,companyId(它是在一些company_details表中预定义的,是的,公司被添加到列表中,但没有注册访问API)被发送,因此我必须生成client-idclient-secret,我将存储在CLIENT_KEY_MANAGEMENT表中。在此基础上编写了一个java代码来生成accessToken
所以我的问题是,我如何根据我在请求中收到的companyId生成client-idclient-secret?我已经看过了。但是在spring-boot oauth中是否有任何预定义的方法可以完成这项工作呢?因为下一步是基于它生成访问令牌。
我也使用了oAuth tutorial。但是,在这个client-idclient-secret存储在属性文件中,而不是在数据库/其他来源。看起来也是一对。
如果有人能指导我使用spring-boot实现上述场景,那就太好了。

ezykj2lf

ezykj2lf1#

有一个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的位置注入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())

BaseClientDetailsorg.springframework.security.oauth2.provider.client封装中提供。
客户端机密将不会由服务生成。您需要生成它并将其设置为BaseClientDetails

igetnqfo

igetnqfo2#

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.OAuth2LoginConfigurer;

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final ClientRegistrationRepository clientRegistrationRepository;

    public SecurityConfiguration(ClientRegistrationRepository clientRegistrationRepository) {
        this.clientRegistrationRepository = clientRegistrationRepository;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2Login()
                .clientRegistrationRepository(clientRegistrationRepository);
    }
}

我需要这个代码为springboot 3

相关问题