package com.relive.repository;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.jdbc.core.*;
import org.springframework.security.jackson2.SecurityJackson2Modules;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.core.AuthenticationMethod;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.function.Function;
/**
* OAuth2客户端持久化扩展
*
* @author: ReLive
* @date: 2022/7/30 22:05
*/
public class JdbcClientRegistrationRepository implements ClientRegistrationRepository, Iterable<ClientRegistration> {
private static final String COLUMN_NAMES = "registration_id,client_id,client_secret,client_authentication_method,authorization_grant_type,client_name,redirect_uri,scopes,authorization_uri,token_uri,jwk_set_uri,issuer_uri,user_info_uri,user_info_authentication_method,user_name_attribute_name,configuration_metadata";
private static final String TABLE_NAME = "oauth2_client_registered";
private static final String LOAD_CLIENT_REGISTERED_SQL = "SELECT " + COLUMN_NAMES + " FROM " + TABLE_NAME;
private static final String LOAD_CLIENT_REGISTERED_QUERY_SQL = LOAD_CLIENT_REGISTERED_SQL + " WHERE ";
private static final String INSERT_CLIENT_REGISTERED_SQL = "INSERT INTO " + TABLE_NAME + "(" + COLUMN_NAMES + ") VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
private static final String UPDATE_CLIENT_REGISTERED_SQL = "UPDATE " + TABLE_NAME + " SET client_id = ?,client_secret = ?,client_authentication_method = ?,authorization_grant_type = ?,client_name = ?,redirect_uri = ?,scopes = ?,authorization_uri = ?,token_uri = ?,jwk_set_uri = ?,issuer_uri = ?,user_info_uri = ?,user_info_authentication_method = ?,user_name_attribute_name = ?,configuration_metadata = ? WHERE registration_id = ?";
private final JdbcOperations jdbcOperations;
private RowMapper<ClientRegistration> clientRegistrationRowMapper;
private Function<ClientRegistration, List<SqlParameterValue>> clientRegistrationListParametersMapper;
public JdbcClientRegistrationRepository(JdbcOperations jdbcOperations) {
Assert.notNull(jdbcOperations, "JdbcOperations can not be null");
this.jdbcOperations = jdbcOperations;
this.clientRegistrationRowMapper = new ClientRegistrationRowMapper();
this.clientRegistrationListParametersMapper = new ClientRegistrationParametersMapper();
}
@Override
public ClientRegistration findByRegistrationId(String registrationId) {
Assert.hasText(registrationId, "registrationId cannot be empty");
return this.findBy("registration_id = ?", registrationId);
}
private ClientRegistration findBy(String filter, Object... args) {
List<ClientRegistration> result = this.jdbcOperations.query(LOAD_CLIENT_REGISTERED_QUERY_SQL + filter, this.clientRegistrationRowMapper, args);
return !result.isEmpty() ? result.get(0) : null;
}
public void save(ClientRegistration clientRegistration) {
Assert.notNull(clientRegistration, "clientRegistration cannot be null");
ClientRegistration existingClientRegistration = this.findByRegistrationId(clientRegistration.getRegistrationId());
if (existingClientRegistration != null) {
this.updateRegisteredClient(clientRegistration);
} else {
this.insertClientRegistration(clientRegistration);
}
}
private void updateRegisteredClient(ClientRegistration clientRegistration) {
List<SqlParameterValue> parameterValues = this.clientRegistrationListParametersMapper.apply(clientRegistration);
PreparedStatementSetter statementSetter = new ArgumentPreparedStatementSetter(parameterValues.toArray());
this.jdbcOperations.update(UPDATE_CLIENT_REGISTERED_SQL, statementSetter);
}
private void insertClientRegistration(ClientRegistration clientRegistration) {
List<SqlParameterValue> parameterValues = this.clientRegistrationListParametersMapper.apply(clientRegistration);
PreparedStatementSetter statementSetter = new ArgumentPreparedStatementSetter(parameterValues.toArray());
this.jdbcOperations.update(INSERT_CLIENT_REGISTERED_SQL, statementSetter);
}
public List<ClientRegistration> findAny() {
List<ClientRegistration> result = this.jdbcOperations.query(LOAD_CLIENT_REGISTERED_SQL, this.clientRegistrationRowMapper);
return result.isEmpty() ? Collections.emptyList() : result;
}
public Iterator<ClientRegistration> iterator() {
return this.findAny().iterator();
}
public static class ClientRegistrationRowMapper implements RowMapper<ClientRegistration> {
private ObjectMapper objectMapper = new ObjectMapper();
public ClientRegistrationRowMapper() {
ClassLoader classLoader = JdbcClientRegistrationRepository.class.getClassLoader();
List<Module> securityModules = SecurityJackson2Modules.getModules(classLoader);
this.objectMapper.registerModules(securityModules);
}
@Override
public ClientRegistration mapRow(ResultSet rs, int rowNum) throws SQLException {
Set<String> scopes = StringUtils.commaDelimitedListToSet(rs.getString("scopes"));
ClientRegistration.Builder builder = ClientRegistration.withRegistrationId(rs.getString("registration_id"))
.clientId(rs.getString("client_id"))
.clientSecret(rs.getString("client_secret"))
.clientAuthenticationMethod(resolveClientAuthenticationMethod(rs.getString("client_authentication_method")))
.authorizationGrantType(resolveAuthorizationGrantType(rs.getString("authorization_grant_type")))
.clientName(rs.getString("client_name"))
.redirectUri(rs.getString("redirect_uri"))
.scope(scopes)
.authorizationUri(rs.getString("authorization_uri"))
.tokenUri(rs.getString("token_uri"))
.jwkSetUri(rs.getString("jwk_set_uri"))
.issuerUri(rs.getString("issuer_uri"))
.userInfoUri(rs.getString("user_info_uri"))
.userInfoAuthenticationMethod(resolveUserInfoAuthenticationMethod(rs.getString("user_info_authentication_method")))
.userNameAttributeName(rs.getString("user_name_attribute_name"));
Map<String, Object> configurationMetadata = this.parseMap(rs.getString("configuration_metadata"));
builder.providerConfigurationMetadata(configurationMetadata);
return builder.build();
}
private static AuthorizationGrantType resolveAuthorizationGrantType(String authorizationGrantType) {
if (AuthorizationGrantType.AUTHORIZATION_CODE.getValue().equals(authorizationGrantType)) {
return AuthorizationGrantType.AUTHORIZATION_CODE;
} else if (AuthorizationGrantType.CLIENT_CREDENTIALS.getValue().equals(authorizationGrantType)) {
return AuthorizationGrantType.CLIENT_CREDENTIALS;
} else {
return AuthorizationGrantType.REFRESH_TOKEN.getValue().equals(authorizationGrantType) ? AuthorizationGrantType.REFRESH_TOKEN : new AuthorizationGrantType(authorizationGrantType);
}
}
private static ClientAuthenticationMethod resolveClientAuthenticationMethod(String clientAuthenticationMethod) {
if (Cli
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
oauth2+openidconnect 授权身份认证 (235个子文件)
AuthorizationServerConfig.class 16KB
DefaultSecurityConfig.class 9KB
JdbcClientRegistrationRepository.class 7KB
JdbcClientRegistrationRepository$ClientRegistrationRowMapper.class 7KB
AuthorityMappingOAuth2UserService.class 6KB
JdbcClientRegistrationRepository$ClientRegistrationParametersMapper.class 5KB
AccessTokenCustomizerConfig.class 5KB
User.class 4KB
ResourceServerConfig.class 4KB
OAuth2ClientRole.class 3KB
Role.class 3KB
UserRepositoryOAuth2UserHandler.class 3KB
JdbcUserDetailsService.class 3KB
OAuth2LoginSecurityConfig.class 3KB
KeyGeneratorUtils.class 3KB
Jwks.class 3KB
SavedUserAuthenticationSuccessHandler.class 3KB
Permission.class 3KB
ArticleController.class 2KB
JdbcClientRegistrationRepository$ClientRegistrationRowMapper$1.class 1KB
GatewayResourceServerApplication.class 772B
GatewayOAuth2ClientApplication.class 766B
ArticleController$1.class 752B
AuthServerApplication.class 739B
OAuth2ClientRoleRepository.class 559B
UserRepository.class 447B
RoleRepository.class 443B
.gitignore 275B
gateway-login.iml 13KB
auth-server.iml 10KB
resourceserver.iml 6KB
demo33.iml 739B
auth-server-1.0-SNAPSHOT.jar 48.51MB
gateway-login-1.0-SNAPSHOT.jar 43.88MB
resourceserver-1.0-SNAPSHOT.jar 20.05MB
JdbcClientRegistrationRepository.java 12KB
AuthorizationServerConfig.java 8KB
DefaultSecurityConfig.java 5KB
AuthorityMappingOAuth2UserService.java 3KB
KeyGeneratorUtils.java 2KB
ResourceServerConfig.java 2KB
AccessTokenCustomizerConfig.java 2KB
SavedUserAuthenticationSuccessHandler.java 2KB
JdbcUserDetailsService.java 2KB
Jwks.java 1KB
UserRepositoryOAuth2UserHandler.java 1KB
ArticleController.java 1KB
OAuth2LoginSecurityConfig.java 964B
User.java 773B
Role.java 712B
OAuth2ClientRole.java 639B
GatewayResourceServerApplication.java 404B
OAuth2ClientRoleRepository.java 399B
GatewayOAuth2ClientApplication.java 399B
AuthServerApplication.java 381B
Permission.java 358B
UserRepository.java 303B
RoleRepository.java 291B
inputFiles.lst 2KB
createdFiles.lst 1KB
inputFiles.lst 279B
createdFiles.lst 189B
inputFiles.lst 188B
createdFiles.lst 98B
auth-server-1.0-SNAPSHOT.jar.original 39KB
resourceserver-1.0-SNAPSHOT.jar.original 6KB
gateway-login-1.0-SNAPSHOT.jar.original 4KB
drawSQL-gateway-oauth2.png 445KB
pom.properties 70B
pom.properties 69B
pom.properties 67B
oauth2.sql 217KB
V1.1__init_oauth.sql 3KB
V1.3__init_user.sql 2KB
V1.2__init_oauth_client.sql 2KB
workspace.xml 5KB
pom.xml 2KB
pom.xml 2KB
pom.xml 2KB
compiler.xml 1KB
pom.xml 1KB
jarRepositories.xml 879B
Maven__org_springframework_security_spring_security_oauth2_authorization_server_0_3_1.xml 856B
Maven__org_springframework_boot_spring_boot_starter_oauth2_resource_server_2_6_7.xml 833B
Maven__org_springframework_security_spring_security_oauth2_resource_server_5_6_3.xml 821B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_13_2.xml 772B
Maven__org_springframework_boot_spring_boot_starter_reactor_netty_2_6_7.xml 770B
Maven__org_springframework_boot_spring_boot_starter_oauth2_client_2_6_7.xml 770B
Maven__org_hibernate_common_hibernate_commons_annotations_5_1_2_Final.xml 768B
Maven__io_netty_netty_resolver_dns_native_macos_osx_aarch_64_4_1_76_Final.xml 767B
Maven__io_netty_netty_resolver_dns_native_macos_osx_x86_64_4_1_76_Final.xml 763B
Maven__io_netty_netty_transport_native_unix_common_4_1_76_Final.xml 762B
Maven__org_springframework_security_spring_security_oauth2_client_5_6_3.xml 758B
Maven__io_netty_netty_transport_native_kqueue_osx_aarch_64_4_1_76_Final.xml 753B
Maven__org_springframework_security_spring_security_rsa_1_0_10_RELEASE.xml 751B
Maven__io_netty_netty_transport_native_epoll_linux_aarch_64_4_1_76_Final.xml 750B
Maven__org_springframework_boot_spring_boot_starter_validation_2_6_7.xml 749B
Maven__org_springframework_boot_spring_boot_starter_data_redis_2_6_7.xml 749B
Maven__io_netty_netty_transport_native_kqueue_osx_x86_64_4_1_76_Final.xml 749B
Maven__io_netty_netty_resolver_dns_classes_macos_4_1_76_Final.xml 748B
共 235 条
- 1
- 2
- 3
资源评论
全栈攻城狮攻略者
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功