importjava.security.Principal;importjava.time.Instant;importjava.util.Set;importorg.springframework.data.redis.core.index.Indexed;importorg.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;publicclassOAuth2AuthorizationCodeGrantAuthorizationextendsOAuth2AuthorizationGrantAuthorization{privatefinalPrincipalprincipal;privatefinalOAuth2AuthorizationRequestauthorizationRequest;privatefinalAuthorizationCodeauthorizationCode;@IndexedprivatefinalStringstate;// Used to correlate the request during the authorization// consent flowpublicOAuth2AuthorizationCodeGrantAuthorization(Stringid,StringregisteredClientId,StringprincipalName,Set<String>authorizedScopes,AccessTokenaccessToken,RefreshTokenrefreshToken,Principalprincipal,OAuth2AuthorizationRequestauthorizationRequest,AuthorizationCodeauthorizationCode,Stringstate){super(id,registeredClientId,principalName,authorizedScopes,accessToken,refreshToken);this.principal=principal;this.authorizationRequest=authorizationRequest;this.authorizationCode=authorizationCode;this.state=state;}publicPrincipalgetPrincipal(){returnthis.principal;}publicOAuth2AuthorizationRequestgetAuthorizationRequest(){returnthis.authorizationRequest;}publicAuthorizationCodegetAuthorizationCode(){returnthis.authorizationCode;}publicStringgetState(){returnthis.state;}publicstaticclassAuthorizationCodeextendsAbstractToken{publicAuthorizationCode(StringtokenValue,InstantissuedAt,InstantexpiresAt,booleaninvalidated){super(tokenValue,issuedAt,expiresAt,invalidated);}}}
importsample.redis.entity.OAuth2RegisteredClient;importsample.redis.repository.OAuth2RegisteredClientRepository;importorg.springframework.lang.Nullable;importorg.springframework.security.oauth2.server.authorization.client.RegisteredClient;importorg.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;importorg.springframework.util.Assert;publicclassRedisRegisteredClientRepositoryimplementsRegisteredClientRepository{privatefinalOAuth2RegisteredClientRepositoryregisteredClientRepository;publicRedisRegisteredClientRepository(OAuth2RegisteredClientRepositoryregisteredClientRepository){Assert.notNull(registeredClientRepository,"registeredClientRepository cannot be null");this.registeredClientRepository=registeredClientRepository;}@Overridepublicvoidsave(RegisteredClientregisteredClient){Assert.notNull(registeredClient,"registeredClient cannot be null");OAuth2RegisteredClientoauth2RegisteredClient=ModelMapper.convertOAuth2RegisteredClient(registeredClient);this.registeredClientRepository.save(oauth2RegisteredClient);}@Nullable@OverridepublicRegisteredClientfindById(Stringid){Assert.hasText(id,"id cannot be empty");returnthis.registeredClientRepository.findById(id).map(ModelMapper::convertRegisteredClient).orElse(null);}@Nullable@OverridepublicRegisteredClientfindByClientId(StringclientId){Assert.hasText(clientId,"clientId cannot be empty");OAuth2RegisteredClientoauth2RegisteredClient=this.registeredClientRepository.findByClientId(clientId);returnoauth2RegisteredClient!=null?ModelMapper.convertRegisteredClient(oauth2RegisteredClient):null;}}
importsample.redis.entity.OAuth2AuthorizationGrantAuthorization;importsample.redis.repository.OAuth2AuthorizationGrantAuthorizationRepository;importorg.springframework.lang.Nullable;importorg.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;importorg.springframework.security.oauth2.core.oidc.endpoint.OidcParameterNames;importorg.springframework.security.oauth2.server.authorization.OAuth2Authorization;importorg.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;importorg.springframework.security.oauth2.server.authorization.OAuth2TokenType;importorg.springframework.security.oauth2.server.authorization.client.RegisteredClient;importorg.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;importorg.springframework.util.Assert;publicclassRedisOAuth2AuthorizationServiceimplementsOAuth2AuthorizationService{privatefinalRegisteredClientRepositoryregisteredClientRepository;privatefinalOAuth2AuthorizationGrantAuthorizationRepositoryauthorizationGrantAuthorizationRepository;publicRedisOAuth2AuthorizationService(RegisteredClientRepositoryregisteredClientRepository,OAuth2AuthorizationGrantAuthorizationRepositoryauthorizationGrantAuthorizationRepository){Assert.notNull(registeredClientRepository,"registeredClientRepository cannot be null");Assert.notNull(authorizationGrantAuthorizationRepository,"authorizationGrantAuthorizationRepository cannot be null");this.registeredClientRepository=registeredClientRepository;this.authorizationGrantAuthorizationRepository=authorizationGrantAuthorizationRepository;}@Overridepublicvoidsave(OAuth2Authorizationauthorization){Assert.notNull(authorization,"authorization cannot be null");OAuth2AuthorizationGrantAuthorizationauthorizationGrantAuthorization=ModelMapper.convertOAuth2AuthorizationGrantAuthorization(authorization);this.authorizationGrantAuthorizationRepository.save(authorizationGrantAuthorization);}@Overridepublicvoidremove(OAuth2Authorizationauthorization){Assert.notNull(authorization,"authorization cannot be null");this.authorizationGrantAuthorizationRepository.deleteById(authorization.getId());}@Nullable@OverridepublicOAuth2AuthorizationfindById(Stringid){Assert.hasText(id,"id cannot be empty");returnthis.authorizationGrantAuthorizationRepository.findById(id).map(this::toOAuth2Authorization).orElse(null);}@Nullable@OverridepublicOAuth2AuthorizationfindByToken(Stringtoken,OAuth2TokenTypetokenType){Assert.hasText(token,"token cannot be empty");OAuth2AuthorizationGrantAuthorizationauthorizationGrantAuthorization=null;if(tokenType==null){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByStateOrAuthorizationCode_TokenValue(token,token);if(authorizationGrantAuthorization==null){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByAccessToken_TokenValueOrRefreshToken_TokenValue(token,token);}if(authorizationGrantAuthorization==null){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByIdToken_TokenValue(token);}if(authorizationGrantAuthorization==null){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByDeviceStateOrDeviceCode_TokenValueOrUserCode_TokenValue(token,token,token);}}elseif(OAuth2ParameterNames.STATE.equals(tokenType.getValue())){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByState(token);if(authorizationGrantAuthorization==null){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByDeviceState(token);}}elseif(OAuth2ParameterNames.CODE.equals(tokenType.getValue())){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByAuthorizationCode_TokenValue(token);}elseif(OAuth2TokenType.ACCESS_TOKEN.equals(tokenType)){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByAccessToken_TokenValue(token);}elseif(OidcParameterNames.ID_TOKEN.equals(tokenType.getValue())){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByIdToken_TokenValue(token);}elseif(OAuth2TokenType.REFRESH_TOKEN.equals(tokenType)){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByRefreshToken_TokenValue(token);}elseif(OAuth2ParameterNames.USER_CODE.equals(tokenType.getValue())){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByUserCode_TokenValue(token);}elseif(OAuth2ParameterNames.DEVICE_CODE.equals(tokenType.getValue())){authorizationGrantAuthorization=this.authorizationGrantAuthorizationRepository.findByDeviceCode_TokenValue(token);}returnauthorizationGrantAuthorization!=null?toOAuth2Authorization(authorizationGrantAuthorization):null;}privateOAuth2AuthorizationtoOAuth2Authorization(OAuth2AuthorizationGrantAuthorizationauthorizationGrantAuthorization){RegisteredClientregisteredClient=this.registeredClientRepository.findById(authorizationGrantAuthorization.getRegisteredClientId());OAuth2Authorization.Builderbuilder=OAuth2Authorization.withRegisteredClient(registeredClient);ModelMapper.mapOAuth2AuthorizationGrantAuthorization(authorizationGrantAuthorization,builder);returnbuilder.build();}}
importsample.redis.entity.OAuth2UserConsent;importsample.redis.repository.OAuth2UserConsentRepository;importorg.springframework.lang.Nullable;importorg.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsent;importorg.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;importorg.springframework.util.Assert;publicclassRedisOAuth2AuthorizationConsentServiceimplementsOAuth2AuthorizationConsentService{privatefinalOAuth2UserConsentRepositoryuserConsentRepository;publicRedisOAuth2AuthorizationConsentService(OAuth2UserConsentRepositoryuserConsentRepository){Assert.notNull(userConsentRepository,"userConsentRepository cannot be null");this.userConsentRepository=userConsentRepository;}@Overridepublicvoidsave(OAuth2AuthorizationConsentauthorizationConsent){Assert.notNull(authorizationConsent,"authorizationConsent cannot be null");OAuth2UserConsentoauth2UserConsent=ModelMapper.convertOAuth2UserConsent(authorizationConsent);this.userConsentRepository.save(oauth2UserConsent);}@Overridepublicvoidremove(OAuth2AuthorizationConsentauthorizationConsent){Assert.notNull(authorizationConsent,"authorizationConsent cannot be null");this.userConsentRepository.deleteByRegisteredClientIdAndPrincipalName(authorizationConsent.getRegisteredClientId(),authorizationConsent.getPrincipalName());}@Nullable@OverridepublicOAuth2AuthorizationConsentfindById(StringregisteredClientId,StringprincipalName){Assert.hasText(registeredClientId,"registeredClientId cannot be empty");Assert.hasText(principalName,"principalName cannot be empty");OAuth2UserConsentoauth2UserConsent=this.userConsentRepository.findByRegisteredClientIdAndPrincipalName(registeredClientId,principalName);returnoauth2UserConsent!=null?ModelMapper.convertOAuth2AuthorizationConsent(oauth2UserConsent):null;}}