42
42
43
43
/**
44
44
* @author Ruby Hartono
45
+ * @author Evgeniy Cheban
45
46
* @since 5.3
46
47
*/
47
48
public final class ClientRegistrationsBeanDefinitionParser implements BeanDefinitionParser {
@@ -87,7 +88,7 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
87
88
CompositeComponentDefinition compositeDef = new CompositeComponentDefinition (element .getTagName (),
88
89
parserContext .extractSource (element ));
89
90
parserContext .pushContainingComponent (compositeDef );
90
- Map <String , Map <String , String >> providers = getProviders (element );
91
+ Map <String , Map <String , String >> providers = getProviders (element , parserContext );
91
92
List <ClientRegistration > clientRegistrations = getClientRegistrations (element , parserContext , providers );
92
93
BeanDefinition clientRegistrationRepositoryBean = BeanDefinitionBuilder
93
94
.rootBeanDefinition (InMemoryClientRegistrationRepository .class )
@@ -107,75 +108,79 @@ private List<ClientRegistration> getClientRegistrations(Element element, ParserC
107
108
for (Element clientRegistrationElt : clientRegistrationElts ) {
108
109
String registrationId = clientRegistrationElt .getAttribute (ATT_REGISTRATION_ID );
109
110
String providerId = clientRegistrationElt .getAttribute (ATT_PROVIDER_ID );
110
- ClientRegistration .Builder builder = getBuilderFromIssuerIfPossible (registrationId , providerId , providers );
111
+ ClientRegistration .Builder builder = getBuilderFromIssuerIfPossible (parserContext , registrationId ,
112
+ providerId , providers );
111
113
if (builder == null ) {
112
- builder = getBuilder (registrationId , providerId , providers );
114
+ builder = getBuilder (parserContext , registrationId , providerId , providers );
113
115
if (builder == null ) {
114
116
Object source = parserContext .extractSource (element );
115
117
parserContext .getReaderContext ().error (getErrorMessage (providerId , registrationId ), source );
116
118
// error on the config skip to next element
117
119
continue ;
118
120
}
119
121
}
120
- getOptionalIfNotEmpty (clientRegistrationElt .getAttribute (ATT_CLIENT_ID )).ifPresent (builder ::clientId );
121
- getOptionalIfNotEmpty (clientRegistrationElt .getAttribute (ATT_CLIENT_SECRET ))
122
+ getOptionalIfNotEmpty (parserContext , clientRegistrationElt .getAttribute (ATT_CLIENT_ID ))
123
+ .ifPresent (builder ::clientId );
124
+ getOptionalIfNotEmpty (parserContext , clientRegistrationElt .getAttribute (ATT_CLIENT_SECRET ))
122
125
.ifPresent (builder ::clientSecret );
123
- getOptionalIfNotEmpty (clientRegistrationElt .getAttribute (ATT_CLIENT_AUTHENTICATION_METHOD ))
126
+ getOptionalIfNotEmpty (parserContext , clientRegistrationElt .getAttribute (ATT_CLIENT_AUTHENTICATION_METHOD ))
124
127
.map (ClientAuthenticationMethod ::new ).ifPresent (builder ::clientAuthenticationMethod );
125
- getOptionalIfNotEmpty (clientRegistrationElt .getAttribute (ATT_AUTHORIZATION_GRANT_TYPE ))
128
+ getOptionalIfNotEmpty (parserContext , clientRegistrationElt .getAttribute (ATT_AUTHORIZATION_GRANT_TYPE ))
126
129
.map (AuthorizationGrantType ::new ).ifPresent (builder ::authorizationGrantType );
127
- getOptionalIfNotEmpty (clientRegistrationElt .getAttribute (ATT_REDIRECT_URI )).ifPresent (builder ::redirectUri );
128
- getOptionalIfNotEmpty (clientRegistrationElt .getAttribute (ATT_SCOPE ))
130
+ getOptionalIfNotEmpty (parserContext , clientRegistrationElt .getAttribute (ATT_REDIRECT_URI ))
131
+ .ifPresent (builder ::redirectUri );
132
+ getOptionalIfNotEmpty (parserContext , clientRegistrationElt .getAttribute (ATT_SCOPE ))
129
133
.map (StringUtils ::commaDelimitedListToSet ).ifPresent (builder ::scope );
130
- getOptionalIfNotEmpty (clientRegistrationElt .getAttribute (ATT_CLIENT_NAME )).ifPresent (builder ::clientName );
134
+ getOptionalIfNotEmpty (parserContext , clientRegistrationElt .getAttribute (ATT_CLIENT_NAME ))
135
+ .ifPresent (builder ::clientName );
131
136
clientRegistrations .add (builder .build ());
132
137
}
133
138
return clientRegistrations ;
134
139
}
135
140
136
- private Map <String , Map <String , String >> getProviders (Element element ) {
141
+ private Map <String , Map <String , String >> getProviders (Element element , ParserContext parserContext ) {
137
142
List <Element > providerElts = DomUtils .getChildElementsByTagName (element , ELT_PROVIDER );
138
143
Map <String , Map <String , String >> providers = new HashMap <>();
139
144
for (Element providerElt : providerElts ) {
140
145
Map <String , String > provider = new HashMap <>();
141
146
String providerId = providerElt .getAttribute (ATT_PROVIDER_ID );
142
147
provider .put (ATT_PROVIDER_ID , providerId );
143
- getOptionalIfNotEmpty (providerElt .getAttribute (ATT_AUTHORIZATION_URI ))
148
+ getOptionalIfNotEmpty (parserContext , providerElt .getAttribute (ATT_AUTHORIZATION_URI ))
144
149
.ifPresent ((value ) -> provider .put (ATT_AUTHORIZATION_URI , value ));
145
- getOptionalIfNotEmpty (providerElt .getAttribute (ATT_TOKEN_URI ))
150
+ getOptionalIfNotEmpty (parserContext , providerElt .getAttribute (ATT_TOKEN_URI ))
146
151
.ifPresent ((value ) -> provider .put (ATT_TOKEN_URI , value ));
147
- getOptionalIfNotEmpty (providerElt .getAttribute (ATT_USER_INFO_URI ))
152
+ getOptionalIfNotEmpty (parserContext , providerElt .getAttribute (ATT_USER_INFO_URI ))
148
153
.ifPresent ((value ) -> provider .put (ATT_USER_INFO_URI , value ));
149
- getOptionalIfNotEmpty (providerElt .getAttribute (ATT_USER_INFO_AUTHENTICATION_METHOD ))
154
+ getOptionalIfNotEmpty (parserContext , providerElt .getAttribute (ATT_USER_INFO_AUTHENTICATION_METHOD ))
150
155
.ifPresent ((value ) -> provider .put (ATT_USER_INFO_AUTHENTICATION_METHOD , value ));
151
- getOptionalIfNotEmpty (providerElt .getAttribute (ATT_USER_INFO_USER_NAME_ATTRIBUTE ))
156
+ getOptionalIfNotEmpty (parserContext , providerElt .getAttribute (ATT_USER_INFO_USER_NAME_ATTRIBUTE ))
152
157
.ifPresent ((value ) -> provider .put (ATT_USER_INFO_USER_NAME_ATTRIBUTE , value ));
153
- getOptionalIfNotEmpty (providerElt .getAttribute (ATT_JWK_SET_URI ))
158
+ getOptionalIfNotEmpty (parserContext , providerElt .getAttribute (ATT_JWK_SET_URI ))
154
159
.ifPresent ((value ) -> provider .put (ATT_JWK_SET_URI , value ));
155
- getOptionalIfNotEmpty (providerElt .getAttribute (ATT_ISSUER_URI ))
160
+ getOptionalIfNotEmpty (parserContext , providerElt .getAttribute (ATT_ISSUER_URI ))
156
161
.ifPresent ((value ) -> provider .put (ATT_ISSUER_URI , value ));
157
162
providers .put (providerId , provider );
158
163
}
159
164
return providers ;
160
165
}
161
166
162
- private static ClientRegistration .Builder getBuilderFromIssuerIfPossible (String registrationId ,
163
- String configuredProviderId , Map <String , Map <String , String >> providers ) {
167
+ private static ClientRegistration .Builder getBuilderFromIssuerIfPossible (ParserContext parserContext ,
168
+ String registrationId , String configuredProviderId , Map <String , Map <String , String >> providers ) {
164
169
String providerId = (configuredProviderId != null ) ? configuredProviderId : registrationId ;
165
170
if (providers .containsKey (providerId )) {
166
171
Map <String , String > provider = providers .get (providerId );
167
172
String issuer = provider .get (ATT_ISSUER_URI );
168
173
if (!StringUtils .isEmpty (issuer )) {
169
174
ClientRegistration .Builder builder = ClientRegistrations .fromIssuerLocation (issuer )
170
175
.registrationId (registrationId );
171
- return getBuilder (builder , provider );
176
+ return getBuilder (parserContext , builder , provider );
172
177
}
173
178
}
174
179
return null ;
175
180
}
176
181
177
- private static ClientRegistration .Builder getBuilder (String registrationId , String configuredProviderId ,
178
- Map <String , Map <String , String >> providers ) {
182
+ private static ClientRegistration .Builder getBuilder (ParserContext parserContext , String registrationId ,
183
+ String configuredProviderId , Map <String , Map <String , String >> providers ) {
179
184
String providerId = (configuredProviderId != null ) ? configuredProviderId : registrationId ;
180
185
CommonOAuth2Provider provider = getCommonProvider (providerId );
181
186
if (provider == null && !providers .containsKey (providerId )) {
@@ -184,26 +189,27 @@ private static ClientRegistration.Builder getBuilder(String registrationId, Stri
184
189
ClientRegistration .Builder builder = (provider != null ) ? provider .getBuilder (registrationId )
185
190
: ClientRegistration .withRegistrationId (registrationId );
186
191
if (providers .containsKey (providerId )) {
187
- return getBuilder (builder , providers .get (providerId ));
192
+ return getBuilder (parserContext , builder , providers .get (providerId ));
188
193
}
189
194
return builder ;
190
195
}
191
196
192
- private static ClientRegistration .Builder getBuilder (ClientRegistration . Builder builder ,
193
- Map <String , String > provider ) {
194
- getOptionalIfNotEmpty (provider .get (ATT_AUTHORIZATION_URI )).ifPresent (builder ::authorizationUri );
195
- getOptionalIfNotEmpty (provider .get (ATT_TOKEN_URI )).ifPresent (builder ::tokenUri );
196
- getOptionalIfNotEmpty (provider .get (ATT_USER_INFO_URI )).ifPresent (builder ::userInfoUri );
197
- getOptionalIfNotEmpty (provider .get (ATT_USER_INFO_AUTHENTICATION_METHOD )). map ( AuthenticationMethod :: new )
198
- .ifPresent (builder ::userInfoAuthenticationMethod );
199
- getOptionalIfNotEmpty (provider .get (ATT_JWK_SET_URI )).ifPresent (builder ::jwkSetUri );
200
- getOptionalIfNotEmpty (provider .get (ATT_USER_INFO_USER_NAME_ATTRIBUTE ))
197
+ private static ClientRegistration .Builder getBuilder (ParserContext parserContext ,
198
+ ClientRegistration . Builder builder , Map <String , String > provider ) {
199
+ getOptionalIfNotEmpty (parserContext , provider .get (ATT_AUTHORIZATION_URI )).ifPresent (builder ::authorizationUri );
200
+ getOptionalIfNotEmpty (parserContext , provider .get (ATT_TOKEN_URI )).ifPresent (builder ::tokenUri );
201
+ getOptionalIfNotEmpty (parserContext , provider .get (ATT_USER_INFO_URI )).ifPresent (builder ::userInfoUri );
202
+ getOptionalIfNotEmpty (parserContext , provider .get (ATT_USER_INFO_AUTHENTICATION_METHOD ))
203
+ .map ( AuthenticationMethod :: new ). ifPresent (builder ::userInfoAuthenticationMethod );
204
+ getOptionalIfNotEmpty (parserContext , provider .get (ATT_JWK_SET_URI )).ifPresent (builder ::jwkSetUri );
205
+ getOptionalIfNotEmpty (parserContext , provider .get (ATT_USER_INFO_USER_NAME_ATTRIBUTE ))
201
206
.ifPresent (builder ::userNameAttributeName );
202
207
return builder ;
203
208
}
204
209
205
- private static Optional <String > getOptionalIfNotEmpty (String str ) {
206
- return Optional .ofNullable (str ).filter ((s ) -> !s .isEmpty ());
210
+ private static Optional <String > getOptionalIfNotEmpty (ParserContext parserContext , String str ) {
211
+ return Optional .ofNullable (str ).filter ((s ) -> !s .isEmpty ())
212
+ .map (parserContext .getReaderContext ().getEnvironment ()::resolvePlaceholders );
207
213
}
208
214
209
215
private static CommonOAuth2Provider getCommonProvider (String providerId ) {
0 commit comments