@@ -192,6 +192,64 @@ open class SecurityConfig {
192
192
----
193
193
======
194
194
195
+ If you are using xref:servlet/saml2/opensaml.adoc[OpenSAML 5], then we have a simpler way, using `OpenSaml5AuthenticationProvider.AssertionValidator`:
196
+
197
+ [tabs]
198
+ ======
199
+ Java::
200
+ +
201
+ [source,java,role="primary"]
202
+ ----
203
+ @Configuration
204
+ @EnableWebSecurity
205
+ public class SecurityConfig {
206
+
207
+ @Bean
208
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
209
+ OpenSaml5AuthenticationProvider authenticationProvider = new OpenSaml5AuthenticationProvider();
210
+ AssertionValidator assertionValidator = AssertionValidator.builder()
211
+ .clockSkew(Duration.ofMinutes(10)).build();
212
+ authenticationProvider.setAssertionValidator(assertionValidator);
213
+ http
214
+ .authorizeHttpRequests(authz -> authz
215
+ .anyRequest().authenticated()
216
+ )
217
+ .saml2Login(saml2 -> saml2
218
+ .authenticationManager(new ProviderManager(authenticationProvider))
219
+ );
220
+ return http.build();
221
+ }
222
+ }
223
+ ----
224
+
225
+ Kotlin::
226
+ +
227
+ [source,kotlin,role="secondary"]
228
+ ----
229
+
230
+
231
+ @Configuration @EnableWebSecurity
232
+ class SecurityConfig {
233
+ @Bean
234
+ @Throws(Exception::class)
235
+ fun filterChain(http: HttpSecurity): SecurityFilterChain {
236
+ val authenticationProvider = OpenSaml5AuthenticationProvider()
237
+ val assertionValidator = AssertionValidator.builder().clockSkew(Duration.ofMinutes(10)).build()
238
+ authenticationProvider.setAssertionValidator(assertionValidator)
239
+ http {
240
+ authorizeHttpRequests {
241
+ authorize(anyRequest, authenticated)
242
+ }
243
+ saml2Login {
244
+ authenticationManager = ProviderManager(authenticationProvider)
245
+ }
246
+ }
247
+ return http.build()
248
+ }
249
+ }
250
+ ----
251
+ ======
252
+
195
253
[[servlet-saml2login-opensamlauthenticationprovider-userdetailsservice]]
196
254
== Coordinating with a `UserDetailsService`
197
255
@@ -368,6 +426,60 @@ provider.setAssertionValidator { assertionToken ->
368
426
While recommended, it's not necessary to call ``OpenSaml4AuthenticationProvider``'s default assertion validator.
369
427
A circumstance where you would skip it would be if you don't need it to check the `<AudienceRestriction>` or the `<SubjectConfirmation>` since you are doing those yourself.
370
428
429
+ If you are using xref:servlet/saml2/opensaml.adoc[OpenSAML 5], then we have a simpler way using `OpenSaml5AuthenticationProvider.AssertionValidator`:
430
+
431
+ [tabs]
432
+ ======
433
+ Java::
434
+ +
435
+ [source,java,role="primary"]
436
+ ----
437
+ OpenSaml5AuthenticationProvider provider = new OpenSaml5AuthenticationProvider();
438
+ OneTimeUseConditionValidator validator = ...;
439
+ AssertionValidator assertionValidator = AssertionValidator.builder()
440
+ .conditionValidators((c) -> c.add(validator)).build();
441
+ provider.setAssertionValidator(assertionValidator);
442
+ ----
443
+
444
+ Kotlin::
445
+ +
446
+ [source,kotlin,role="secondary"]
447
+ ----
448
+ val provider = OpenSaml5AuthenticationProvider()
449
+ val validator: OneTimeUseConditionValidator = ...;
450
+ val assertionValidator = AssertionValidator.builder()
451
+ .conditionValidators { add(validator) }.build()
452
+ provider.setAssertionValidator(assertionValidator)
453
+ ----
454
+ ======
455
+
456
+ You can use this same builder to remove validators that you don't want to use like so:
457
+
458
+ [tabs]
459
+ ======
460
+ Java::
461
+ +
462
+ [source,java,role="primary"]
463
+ ----
464
+ OpenSaml5AuthenticationProvider provider = new OpenSaml5AuthenticationProvider();
465
+ AssertionValidator assertionValidator = AssertionValidator.builder()
466
+ .conditionValidators((c) -> c.removeIf(AudienceRestrictionValidator.class::isInstance)).build();
467
+ provider.setAssertionValidator(assertionValidator);
468
+ ----
469
+
470
+ Kotlin::
471
+ +
472
+ [source,kotlin,role="secondary"]
473
+ ----
474
+ val provider = new OpenSaml5AuthenticationProvider()
475
+ val assertionValidator = AssertionValidator.builder()
476
+ .conditionValidators {
477
+ c: List<ConditionValidator> -> c.removeIf { it is AudienceRestrictionValidator }
478
+ }.build()
479
+ provider.setAssertionValidator(assertionValidator)
480
+ ----
481
+ ======
482
+
371
483
[[servlet-saml2login-opensamlauthenticationprovider-decryption]]
372
484
== Customizing Decryption
373
485
0 commit comments